在 ArrayFormula 中组合文本

Combine Text in ArrayFormula

我有一个 table 使用 Google 表格。它具有三列,这些列始终具有空值或该列的特定值。每行将有一个、两个或三个值;它永远不会在一行中包含三个空值。在第四列中,我想要一个 ArrayFormula,它将组合这些值并在多个值时用逗号分隔值。

这是一张我正在努力完成的照片。

到目前为止,我已经尝试了几个想法,这个公式是我迄今为止得到的最接近的公式,但它仍然不能正常工作;我认为它在加入之前将每一列视为一个数组,而不是逐行执行函数。我使用的是 LEN 函数而不是 A2="" 或 ISBLANK(A2),因为列 A-C 也是 ArrayFormulas。我意识到这可能不是最有效的公式,但我认为它涵盖了所有可能性。我当然也愿意接受其他想法。

={"Focus";
  ArayFormula(
    IFS(
      $A:$A="", "",
      (LEN(A2:A)>0 & LEN(B2:B)>0 & LEN(C2:C)>0), TEXTJOIN(", ", TRUE, A2:A, B2:B, C2:C),
      (LEN(A2:A)>0 & LEN(B2:B)>0 & LEN(C2:C)=0), TEXTJOIN(", ", TRUE, A2:A, B2:B),
      (LEN(A2:A)>0 & LEN(B2:B)=0 & LEN(C2:C)>0), TEXTJOIN(", ", TRUE, A2:A, C2:C),
      (LEN(A2:A)=0 & LEN(B2:B)>0 & LEN(C2:C)>0), TEXTJOIN(", ", TRUE, B2:B, C2:C),
      (LEN(A2:A)>0 & LEN(B2:B)=0 & LEN(C2:C)=0), A2:A,
      (LEN(A2:A)=0 & LEN(B2:B)>0 & LEN(C2:C)=0), B2:B,
      (LEN(A2:A)=0 & LEN(B2:B)=0 & LEN(C2:C)>0), C2:C
    )
  )
}

是否可以使用 Google 张来实现此目的?

Sample File

请尝试:

=ARRAYFORMULA(SUBSTITUTE(TRIM(TRANSPOSE(QUERY(TRANSPOSE(FILTER(A2:C,ROW(A2:C)<=MAX(IF(LEN(A2:C),ROW(A2:C)*COLUMN(A2:C)^0,0)))),,2^99)))," ",", "))

备注:

  • 如果某些名称中包含 space,则公式将无法正常工作:例如 "Aston Martin"
  • 所以如果你有 spaces,请试试这个:

=ARRAYFORMULA(SUBSTITUTE( SUBSTITUTE(TRIM(TRANSPOSE(QUERY(TRANSPOSE(FILTER(SUBSTITUTE(A2:C," ",char(9)),ROW(A2:C)<=MAX(IF(LEN(A2:C),ROW(A2:C)*COLUMN(A2:C)^0,0)))),,2^99)))," ",", "), CHAR(9)," "))

编辑

注意到较短的变体(没有 *COLUMN(A2:C)^0)会起作用:

=ARRAYFORMULA(SUBSTITUTE( SUBSTITUTE(TRIM(TRANSPOSE(QUERY(TRANSPOSE(FILTER(SUBSTITUTE(A2:C," ",char(9)),ROW(A2:C)<=MAX(IF(LEN(A2:C),ROW(A2:C),0)))),,2^99)))," ",", "), CHAR(9)," "))

备注:

  • 我使用了一个老技巧来连接带有 array-formula 的字符串。参见 sample file

解释

如果您想了解任何分层公式,最好的方法是将其分成几部分:

部分 1. 过滤数据

  1. FILTER(any_columns,ROW(A2:C)<=MAX(IF(LEN(A2:C),ROW(A2:C)*COLUMN(A2:C)^0,0)))。这是我限制数据范围的方法。
  2. 范围是开放的,意味着它从第二行开始(A2)并且 在任何行结束。
  3. 我想在这一步中得到有限的数组,以减少公式应该做的工作。这是通过条件 if 完成的。
  4. ROW(A2:C) 必须小于或等于最大数据行。 MAX(IF(LEN(A2:C), some_rows) 给出最大行。
  5. If(len.. 部分检查单元格中是否包含文本。
  6. 注释some_rows部分: MAX(IF(LEN(A2:C),ROW(A2:C)*COLUMN(A2:C)^0,0)))),,2^99)))ROW(A2:C) 必须乘以列,因为 filter 公式 只需要一行进入它的状态。这就是为什么我乘以 COLUMN(A2:C)^0 为 1 的列。 编辑。现在注意到, 该公式在没有 *COLUMN(A2:C)^0 的情况下也能正常工作,所以它是 矫枉过正。

第2部分.加入正文

  1. query 公式有 3 个参数:数据、query_text 和一个 number_of_header_rows。

  2. data是用滤镜制作的

  3. query_text 是空的,这相当于 select 全部 ("select *").

  4. 而 header 的行数是一个很大的数字 (2^99)。 这是一个技巧:当 query 比一行多 header 时, 它将加入 space.

  5. 合并后,transpose函数会将结果转换回列。

第 3 部分. 替换和 trim

  1. 函数trim删除多余的space。

  2. 然后我们将spaces替换为分隔符:", "。这就是为什么 如果 spaces 是字符串,则需要修改公式。正确的 结果:"Ford, Aston Martin"。不正确:"Ford, Aston, Martin"。但 如果我们之前用一些字符替换 spaces(char(9) 是 Tab), 那我们这一步就不替换了。