google-sheets - 在 ArrayFormula 中组合文本

标签 google-sheets spreadsheet array-formulas

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

这是一张我正在努力完成的照片。 enter image description here

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

={"Focus";
  ArayFormula(
    IFS(
      $A$2:$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)))," ",", "))

注意事项:

  • 如果某些名称内部有空格,公式将无法正常工作:例如“Aston Martin”
  • 所以如果你有空间,请试试这个:

=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这是带有 1s 的列。 编辑。现在注意到, 该公式在没有 *COLUMN(A2:C)^0 的情况下工作正常, 所以这是一个 矫枉过正。

Part 2.加入正文

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

  2. data是用过滤器制成的。

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

  4. 标题的行数是一个很大的数字 ( 2^99 )。 这是一个技巧:当一个 query标题多于一行, 它将用空间加入它们。

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

第 3 部分. 替换和修剪

  1. 函数trim删除多余的空格。

  2. 然后我们用分隔符替换空格:", " .这就是为什么 如果字符串中有空格,则需要修改公式。正确的 结果:“福特,阿斯顿马丁”。不正确:“福特、阿斯顿、马丁”。但 如果我们之前用一些字符替换空格(char(9) 是 Tab), 那我们这一步不替换。

关于google-sheets - 在 ArrayFormula 中组合文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456012/

相关文章:

javascript - 尝试通过 Google Sheet 上的 ARRAYFORMULA 应用 CONCATENATE

google-sheets - Google表格查询总和不确定的列数

javascript - 使用 MailApp.sendEmail 设置正文电子邮件文本格式的替代方法

google-sheets - 谷歌表格中的多层嵌套饼图

ruby-on-rails - 是否可以使用十六进制或 RGB 颜色设置行样式或在电子表格 gem 中使用偶数/奇数属性?

google-app-engine - 从 Go on AppEngine 中的 init() 函数获取 URL

arrays - 将二维数组公式输出为格式化字符串

google-sheets - 使用多个 Google Sheets 和 QUERY 函数进行外部联接

google-apps-script - 一次在 Gmail 线程中搜索多个未读标签的脚本

c# - 在 telerik RadSpreadSheet 中,如何从单元格索引或选择中获取单元格名称?