在 Google 工作表中,如何在多个工作表的列表中搜索一个值,并且 return 如果至少有一个匹配项则得到一个结果?

In Google Sheets, how do I search for a value in lists in multiple sheets, and return a result if there is at least one match?

我有一个 sheet,A 列中有公司名称列表 - 其中一些公司名称出现在不同用户的 sheet 中,这些用户在这些名称旁边的列中有一个勾选框公司。

我想在我的 sheet 中有一列,它会告诉我这家公司是否在某个用户的 sheet 中打勾,如果是,请将用户名放在下一个单元格中给它。如果没有,它可以保持空白。此时同一公司在两个不同 sheet 中的复选框为 TRUE 的可能性可以忽略不计。

在下面的示例 sheet 中,我在单元格 B2 中使用了以下公式:

=ifs(vlookup(A2,Sheet2!$A:$B,2,false)=TRUE,"Sam",vlookup(A2,Sheet3!$A:$B,2,false)=TRUE,"Nick",vlookup(A2,Sheet4!$A:$B,2,false)=TRUE,"Mike")

它适用于前两个条件,但它似乎不适用于第三个逻辑对。请注意,下面的示例 sheet 使用跨选项卡的 vlookup,实际 sheet 将使用 importrange,但我认为它不会有什么不同。

有什么问题吗?

示例 sheet here

使用:

=ARRAYFORMULA(IFNA(VLOOKUP(A2:A, QUERY({
 QUERY(Sheet2!A2:B, "select A,B,'Sam'"); 
 QUERY(Sheet3!A2:B, "select A,B,'Nick'"); 
 QUERY(Sheet4!A2:B, "select A,B,'Mike'")}, 
 "where Col2=TRUE"), 3, )))

一个更普遍的问题

为了使它更通用以便其他人发现它有用(这是 Whosebug 的重点),一般问题可以改写为

"How do I search for a value in lists in multiple sheets, and return a result if there is at least one match?"

一般来说,在使用VLOOKUP()QUERY()或其他匹配函数时,您必须通过non-matches来解释任何错误。除非明确处理,否则那些向外“移动”到外部函数并最终可能成为报告的结果。有时,当您有时得到答案时,这不太明显,但那是因为外部函数忽略或未评估匹配函数。

因此,请始终考虑如果匹配函数 return 是 N/A 并显式处理它会发生什么。

你的榜样

在您的情况下,IFS() 只是在 VLOOKUP() 不匹配时引发错误。但是,由于 IFS() return 是第一个匹配的条件,在公式中从左到右,它并不总是绕过评估 non-matching VLOOKUP() 中的一个这就是为什么您有时会看到它起作用的原因。

因此,您应该明确地处理错误,例如IFERROR()

我的方法是避免使用查找函数,只通过那些已填满复选框的列表来过滤列表,然后计算感兴趣的事件(“公司 1”、“公司 2”、...) 19=]。如果计数总数为 1,则我们有一个匹配项,因此将该条目作为数组中的一个元素获取。否则,保留一个空值。

此时,您可以删除空元素,并取第一个 non-empty 元素(或 return 为空白),但我选择列出所有名称。

为了去掉空格,我使用 QUERY() 然后 JOIN() 来列出每个名字。在没有任何匹配项且我的数组为空的情况下,我将所有内容简单地包装在一个 IFERROR().

=IFERROR(JOIN(", ",QUERY(TRANSPOSE({IF(COUNTIF(FILTER(Sam!A:A,Sam!B:B=TRUE),A2)=1,"Sam",""),IF(COUNTIF(FILTER(Nick!A:A,Nick!B:B=TRUE),A2)=1,"Nick",""),IF(COUNTIF(FILTER(Mike!A:A,Mike!B:B=TRUE),A2)=1,"Mike","")}),"SELECT Col1 WHERE Col1 IS NOT NULL",0)),"")

我发现您的示例可以方便地将“Sheet2”重命名为“Sam”,“Sheet3”重命名为“Nick”,“Sheet4”重命名为“Mike”,我认为这是您的原意。

可以轻松修改公式以仅显示第一个匹配结果。