【问题标题】:Return a list of all pairs row/column if condition of cell value is met如果满足单元格值的条件,则返回所有对行/列的列表
【发布时间】:2019-09-07 23:38:27
【问题描述】:

给定一个类似于以下的 Google Sheet 表格:

  +---+---A--+---B--+---C--+---D--+
  | 1 |      | col1 | col2 | col3 |
  |---+------+------+------+------+
  | 2 | row1 |    1 |  X   |   45 |
  | 3 | row2 |    5 |      |      |
  | 4 | row3 |    4 |      |   34 |
  +---+------+------+------+------+

其中 row1、col1 是标题标签,“X”也是“行/列”组合的有效值;

我需要检索不为空的所有可能组合行/列标题的列表,在此示例中意味着:

row1 | col1
row2 | col1
row3 | col1
row1 | col2
row1 | col3
row3 | col3

我尝试了不同的方式,例如使用 ISBLANK 函数或 QUERY 函数:

=QUERY(A1:D4, "SELECT A,B,C,D WHERE B IS NOT NULL OR C IS NOT NULL OR D IS NOT NULL",1)

但只是先前表的一个子集,我不能 GROUP BY,因为没有聚合函数;

【问题讨论】:

  • 你能提供更大的样本/例子吗?

标签: google-sheets


【解决方案1】:

考虑一个包含 3 张工作表的电子表格,“Main”、“LabelTable”和“List”。

“Main”包含数据:

+---+---A--+---B--+---C--+---D--+
| 1 |      | col1 | col2 | col3 |
|---+------+------+------+------+
| 2 | row1 |    1 |  X   |   45 |
| 3 | row2 |    5 |      |      |
| 4 | row3 |    4 |      |   34 |
+---+------+------+------+------+

从 A2:D4 创建一个命名范围并命名为“数据”。

我的解决方案是先在表格的“LabelTable”上制作一个附表:

+-------+---A--+------B-----+------C-----+------D-----+
|  1    |      |    col1    |    col2    |    col3    |
|-------+------+------------+------------+------------+
|  2    | row1 | row1 col1; | row1 col2; | row1 col3; |
|  3    | row2 | row2 col1; | row2 col2; | row2 col3; |
|  4    | row3 | row3 col1; | row3 col2; | row3 col3; |
+-------+------+------------+------------+------------+

行数和列数与“Main”上的表格大小相匹配。

如果您有一个大表格,您可以通过使用 B2 中的公式 =$A2&","&B$1&";" 并在所需范围的右下角上下复制来轻松生成这些表格。

然后我从 B2:D4 创建了一个命名范围“标签”(或者对于较大的表,该表内容的完整范围)

在“列表”上,我输入了公式:

=transpose(split(concatenate(arrayformula(if(not(ISBLANK(Data)),Labels,""))),";"))

这会生成一个配对列表,例如“Row1Col1”,对应于每个非空白值。

说明

这使用ISBLANK() 来确定单元格是否为空。结合“外部”上的ARRAYFORMULA(),这将创建一个 TRUE 或 FALSE 值表。然后它用IF() 包装 TRUE/FALSE 表,以创建对应于 TRUE/FALSE 表为 TRUE 的位置的标签表。这就是命名范围“标签”的用武之地——它提供了没有空值的单元格引用。

然后将所有这些都包装在CONCATENATE() 中,以提供一个包含引用的单元格。然后SPLIT() 被用来把它变成一个数组——这也是为什么“;”已添加到“标签”中的单元格引用中。最后,TRANSPOSE() 用于将1xN 数组转换为Nx1 数组,即单列。

限制

如果您有一个动态表格,那么您还需要使“标签”动态匹配。此方法不这样做。

如果由于某种原因有一个要求意味着您不能在“LabelTable”上拥有随附的表格,那么此方法将不起作用。还需要做更多工作才能将其“融入”公式中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多