来自多个工作表的 Google 表格复杂数组

Posted

技术标签:

【中文标题】来自多个工作表的 Google 表格复杂数组【英文标题】:Google Sheets complex array from multiple sheets 【发布时间】:2021-12-03 20:34:06 【问题描述】:

我正在寻找一个公式来检查列是否为真值,如果为真则返回第一个列名,按顺序...

以下是我一直在尝试构建的公式,但它没有按预期工作,尽管我认为我很接近。

=ARRAYFORMULA(IF(HLOOKUP($A16,Sheet1!$B$2:$E$5,Sheet2!$B$8:$E$11,3,4,5,0)=TRUE,Sheet2!$A$3:$A$5,Sheet1!$A$3:$A5,""))

让我来说明一下。表 1 和表 2 包含名称以及谁拥有什么(复选框项目)。在单元格 B16 中使用一个公式,该公式将在右侧和向下填充所有在查找值 (A:A) 中包含 TRUE 值的名称。

上面的图片是手动输入的,公式根本不起作用。

请帮忙!

编辑:Link to sheet

【问题讨论】:

两个表中的名字可以重复吗? 我添加了指向工作表的链接。名称可以重复是,但不能在同一张纸上重复。就在工作表之间,check1、check2 等始终是唯一的 【参考方案1】:

尝试:

=INDEX(IFERROR(VLOOKUP(A14:A, SUBSTITUTE(REGEXREPLACE(SPLIT(FLATTEN(
 QUERY(SUBSTITUTE(QUERY(SPLIT(FLATTEN(
 IF(B3:E5; B9:E11=TRUE, 
 B2:E2&"♦"&A3:A5&"♣"&ROW(A3:A5); 
  B8:E8&"♦"&A9:A11&"♣"&ROW(A9:A11), )), "♦"), 
 "select max(Col2) where Col2 is not null group by Col2 pivot Col1"), 
 " ", "♥"),,9^9)), " "), "(♣\d+)", ), "♥", " "), 
 SEQUENCE(1, COUNTUNIQUE(B2:E2, B8:E8))+1, 0)))

demo sheet

【讨论】:

它似乎在您的示例中有效,但我无法修改它以适应多张纸。正如我在原始帖子中链接的示例表并修改了您的代码以反映引用的单元格。哇,多么疯狂的公式。我希望我能理解它的一半...... @KevinP。看你的表 惊人的工作!我将把它转换到我的真实世界表中,我有很多东西可以玩。有几个问题让我想一想。那里的关键代码是否为每个实例分配一个唯一值?如果我有 20 多个名字,我需要 20 多个标识符吗? 9^9 在做什么? ♣\d+?最后一个“♥”? 您只需要扩展范围以满足您的需求。如果您的意思是“键码” *789 - 它只是偏移范围的额外内容。很可能你可以放弃它。 9^9 只是一个大得离谱的数字 - 如果它高于所有范围的总行数,则可以是您希望的任何数字。它的作用是强制 QUERY 将所有行压缩为一行。 ♥♦♣ 只是独特的符号......您可以使用任何您想要的符号,但您的数据集中不存在这些符号。 ♣\d+?是正则表达式,表示删除 ♣ 后跟任意数字。 将数据集中的空格替换为 ♥ 是由于 QUERY(,,9^9) 有一个小的副作用 - 通过将所有单元格压缩为单个单元格,它将所有单元格与空白空间连接起来 - 这是在这种情况下有点方便,因为我们可以用那个空白空间很好地分割它(但不是初始空间 ofc 因为这会搞砸一切,所以我们将所有空间转换为心,进行查询粉碎和分割,然后将心转换回空格跨度> 【参考方案2】:

这是另一种方法(类似于 player0,但不同之处足以保证单独的答案:

=ArrayFormula(IFERROR(TRIM(SPLIT(VLOOKUP(FILTER(A3:A,A3:A<>""),REGEXREPLACE(SPLIT(FLATTEN(QUERY(QUERY(SPLIT(QUERY(FLATTEN(IF(Sheet1!B2:E<>TRUE,,Sheet1!B1:E1&"~|"&Sheet1!A2:A&",");IF(Sheet2!B2:E<>TRUE,,Sheet2!B1:E1&"~|"&Sheet2!A2:A&",")),"Select * WHERE Col1 Is Not Null"),"|"), "Select MAX(Col2) where Col2 IS NOT NULL GROUP BY Col2 PIVOT Col1"),, 9^9)),"~"),"[,\s]+$",""),2,FALSE),","))))

我已将其添加到新工作表中的电子表格中(“Erik 帮助”)。

如果您要包含两个以上的表格,只需找到公式的这一部分并继续该模式:

IF(Sheet1!B2:E<>TRUE,,Sheet1!B1:E1&"~|"&Sheet1!A2:A&","); IF(Sheet2!B2:E<>TRUE,,Sheet2!B1:E1&"~|"&Sheet2!A2:A&",")

【讨论】:

非常感谢!我喜欢不必依赖表情符号或 char() 字符串。它有助于剖析这个公式,以便在几张纸上使用。我在我的示例公式上还差得很远......至少剩下的 75% 哈哈。 不客气。临时连接/拆分字符是什么并不重要,只要确定永远不会出现在实际工作表数据中(在您的情况下,名称或检查标签)。这就是为什么你会经常看到像 player0 的俱乐部符号这样的字符:因为我们知道它永远不会出现。我倾向于使用管道符号(除非该字符将在 REGEX 类型表达式的公式中的某处使用)或波浪号。但这只是个人风格的问题。 我注意到我无法在前两个参数中调整 A:Z 以上的范围。有什么我遗漏的,还是只是表格的限制?例如我有: IF(Sheet1!B2:AZ<>TRUE,,Sheet1!B1:AZ1&"~|"&Sheet1!A2:A&","); IF(Sheet2!B2:AZ<>TRUE,,Sheet2!B1:AZ1&"~|"&Sheet2!A2:A&",") 它坏了。 请记住,我们看不到您所看到的。您在这里只显示部分公式。而且我们不知道错误是什么(只有“它坏了”)。因此,如果没有看到您调整后的完整公式或电子表格本身(最好两者兼有),我无法告诉您更多信息。 完全理解,当我发表这篇文章时,我不知道我会超出 A:Z 的范围,直到我开始制作工作表。我还没有创建它。您提供的代码可以完美运行,直到我将范围扩展到 A:Z 之外(更改时所有其他范围都很好)。您想要我的工作表副本的链接吗?

以上是关于来自多个工作表的 Google 表格复杂数组的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps 脚本按钮:我可以分配一个未附加到工作表的“全局”脚本吗?

excel多个表格合并成一个工作表的方法

执行多个SUMIFS - Google表格脚本编辑器

如何在同一电子表格中获取已发布的Google工作表的不同网址

如何将html表格转换为具有多个工作表的excel?

LINQ to SQL:对来自订购系统的多个表的报告的聚合数据进行复杂查询