在ArrayFormula

时间:2018-01-26 04:58:46

标签: 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表格实现这一目标?

1 个答案:

答案 0 :(得分:3)

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)))," ",", "))

注意:

  • 如果某些名称中有空格,公式将无法正常工作:例如&#34;阿斯顿马丁&#34;
  • 所以如果你有空格,请试试这个:

=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,公式可以正常工作,所以它是一个 矫枉过正。
  7. 第2部分。加入文字

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

    2. data是使用过滤器制作的。

    3. query_text为空,这相当于全部选择 ("select *")。

    4. 标题的行数是一个大数字(2^99)。  这是一个技巧:当query有更多标题然后一行时,  它将与空间联系起来。

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

    6. 第3部分。替换和修剪

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

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