【问题标题】:Search for Value and Return All Columns In Which Value Appears搜索值并返回出现值的所有列
【发布时间】:2021-02-28 00:25:50
【问题描述】:

我在 Google 表格中有以下一组姓名列表:

╔═══╦════════════╦══════════╦══════════╗
║   ║     A      ║     B    ║     C    ║
╠═══╬════════════╬══════════╬══════════╣
║ 1 ║ Barry      ║ Rich     ║ David    ║
╠═══╬════════════╬══════════╬══════════╣
║ 2 ║ Rich       ║ Jeff     ║ Michael  ║
╠═══╬════════════╬══════════╬══════════╣
║ 3 ║ Bruce      ║ Bruce    ║ Jeff     ║
╠═══╬════════════╬══════════╬══════════╣
║ 4 ║ Rober      ║ Barry    ║ Joel     ║
╠═══╬════════════╬══════════╬══════════╣
║ 5 ║ David      ║ Joel     ║ Howard   ║
╠═══╬════════════╬══════════╬══════════╣
║ 6 ║ Michael    ║ Howard   ║ Rich     ║
╚═══╩════════════╩══════════╩══════════╝

我正在尝试找出一个公式来搜索名称并返回出现在该名称所在的每一列中的所有名称。例如,如果我搜索 Joel,我想获取B 列和 C 列。

【问题讨论】:

标签: regex google-sheets google-sheets-formula array-formulas


【解决方案1】:

您要求的公式

...搜索名称并返回出现在该名称所在的每一列中的所有名称

请使用以下公式

=query(ArrayFormula(regexextract( 
                query(flatten(TRANSPOSE(ArrayFormula(column(A2:C)&"-"&A2:C))), 
                   "where Col1 matches '"&textjoin("|",1,(ArrayFormula(if(A2:C=A1,column(A2:C)&"-.*",""))))&"' ") 
                                ,"-(.*)")),  
    "where Col1 is not null ")

【讨论】:

  • 请记住,根据site guidelines,当答案解决您的问题时,accept 甚至upvote 它也可以让其他人受益。
  • 这很棒。它与@kirkg13 提供的解决方案功能相同,但代码更少。
  • " 它的作用与..." 相同。的种类。 上述公式的最大好处是,无论名称列表有多长,它都保持不变,而在另一个公式中,您需要更新它并为添加的每一行展开“循环” .如果你有,你能想象它的长度吗? 20 行还是 50 行?我会说最接近的公式是@basic
  • 是的。随着电子表格的增长,将添加更多列。我有一个自定义函数,它使用 getLastColumn() 在这个公式中设置它(我在你的样本引用 C 列的所有地方都替换了它,并且效果很好)。这样我就不必随着它的增长而不断进行调整。
【解决方案2】:

你可以试试下面的公式:

=IFERROR(INDEX($A:$C,0,SMALL(FILTER(FLATTEN(COLUMN($A:$C)*("Jeff"=$A:$C)),FLATTEN(COLUMN($A:$C)*("Jeff"=$A:$C))>0),COLUMN(A1))),"")

这个公式自动填充行,而不是列,所以把它复制到右边。

【讨论】:

    【解决方案3】:

    试试这样:

    =VLOOKUP("Joel", A:C, {2, 3}, 0)
    

    下一级:

    =IFNA(VLOOKUP(A1, Sheet1:A:C, {2, 3}, 0))
    

    下一级:

    =ARRAYFORMULA(IFNA(VLOOKUP(A1:A, Sheet1:A:C, {2, 3}, 0)))
    

    如果有更多列:

    =ARRAYFORMULA(IFNA(VLOOKUP(A1:A, Sheet1:A:C, COLUMN(B:K), 0)))
    

    如果 Joel 在 B 列并且您想返回 A 和 C 列:

    =ARRAYFORMULA(IFNA(VLOOKUP(A1:A, {Sheet1!B:B, Sheet1!A:C}, {2, 4}, 0)))
    

    【讨论】:

    • 这些只为我返回一个名字。我需要获取“Joel”出现的整个列。
    • @Dave 你能分享一份你的工作表吗?
    • 它是专有的,所以我不能分享它,但它与我上面的示例完全相同,但有更多的行和列。
    • 不清楚您的输入是什么...您的 joel 是在一个单元格中还是跨范围?如果它在一个单元格中,您希望输出为多行?您的示例中的第 4 行和第 5 行?
    • “乔尔”在 B5 和 C4 中。所以我想要一个列 B 和 C 中所有名称的列表。使用相同的示例数据,如果我搜索“Michael”(在 A6 和 C2 中)我想要列 A 和C.
    【解决方案4】:

    您是否正在寻找这样的输出:

    让我们知道这是否有帮助。

    主要公式有点暴力,但非常简单。 但它可能会出现问题,具体取决于您的数据中可能有多少行或列。

    =TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
                 where Col1 = '" & F1 & "' 
                    or Col2 = '" & F1 & "' 
                    or Col3 = '" & F1 & "' 
                    or Col4 = '" & F1 & "' 
                    or Col5 = '" & F1 & "' 
                    or Col6 = '" & F1 & "' ",0))
    

    更新:

    要将所有结果放在一个列中,有多种选择。您还没有说是否需要唯一值或名称排序,所以我将忽略这些方面,并将结果垂直堆叠。

    一种简单的方法是使用未记录的函数FLATTEN,在某些时候可能会或可能不会从表格中删除。

    添加到我的原始公式中,得到:

    =FLATTEN(TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
                 where Col1 = '" & F1 & "' 
                    or Col2 = '" & F1 & "' 
                    or Col3 = '" & F1 & "' 
                    or Col4 = '" & F1 & "' 
                    or Col5 = '" & F1 & "' 
                    or Col6 = '" & F1 & "' ",0)))
    

    但您可能希望一列堆叠在另一列之上,而不是合并。在这种情况下,您可以尝试这个丑陋的公式,它需要多次重复查询,以检查输出中有多少列。如果您必须这样做,我建议将查询结果保存在辅助范围中,或者提交一个新的更具体的问题:

    ={query({TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
                 where Col1 = '" & F1 & "' 
                    or Col2 = '" & F1 & "' 
                    or Col3 = '" & F1 & "' 
                    or Col4 = '" & F1 & "' 
                    or Col5 = '" & F1 & "' 
                    or Col6 = '" & F1 & "' ",0))},"select Col1 ",0); 
     if(columns(TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
                 where Col1 = '" & F1 & "' 
                    or Col2 = '" & F1 & "' 
                    or Col3 = '" & F1 & "' 
                    or Col4 = '" & F1 & "' 
                    or Col5 = '" & F1 & "' 
                    or Col6 = '" & F1 & "' ",0)))>1,
         query({TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
                 where Col1 = '" & F1 & "' 
                    or Col2 = '" & F1 & "' 
                    or Col3 = '" & F1 & "' 
                    or Col4 = '" & F1 & "' 
                    or Col5 = '" & F1 & "' 
                    or Col6 = '" & F1 & "' ",0))},"select Col2 ",0),
         "");
      if(columns(TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
                 where Col1 = '" & F1 & "' 
                    or Col2 = '" & F1 & "' 
                    or Col3 = '" & F1 & "' 
                    or Col4 = '" & F1 & "' 
                    or Col5 = '" & F1 & "' 
                    or Col6 = '" & F1 & "' ",0)))>2,
         query({TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
                 where Col1 = '" & F1 & "' 
                    or Col2 = '" & F1 & "' 
                    or Col3 = '" & F1 & "' 
                    or Col4 = '" & F1 & "' 
                    or Col5 = '" & F1 & "' 
                    or Col6 = '" & F1 & "' ",0))},"select Col3 ",0),
         "")}
    

    【讨论】:

    • 这对我来说效果很好,但如果我希望所有数据都显示在一列中怎么办?
    • 请将您的 cmets 重新添加到您的问题中,以便将来其他人在阅读问题时更清楚地了解它们是否符合他们的情况。有几种方法可以将结果放在一列中。请参阅上面我编辑的答案。
    • 根据您的数据,我现在意识到我的公式可能需要一些改进,以计算输入数据的行数,并相应地修改查询。在继续之前,我会等着听听这对你来说是否有问题。
    • 我确实想要 UNIQUE 和 SORT。使用 FLATTEN 解决方案,我可以很容易地将整个事情包装在 UNIQUE 和 SORT 中(我经常使用的公式)。在您看来,这是最好的方法吗?
    【解决方案5】:

    或者也许:

    =ARRAYFORMULA(FLATTEN(SPLIT(TRIM(REGEXREPLACE(FILTER(A:A&" "&B:B&" "&C:C, 
     REGEXMATCH(A:A&" "&B:B&" "&C:C, D10)), D10, )), " ")))
    

    【讨论】:

      猜你喜欢
      • 2016-01-10
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多