我有一张使用 Google 表格的表格。它具有三列,这些列始终具有空值或该列的特定值。每行将有一个、两个或三个值;它永远不会在一行中包含三个空值。在第四列中,我想要一个 ArrayFormula 来组合这些值,如果有多个值,则用逗号分隔这些值。
到目前为止,我已经尝试了几个想法,这个公式是我迄今为止得到的最接近的公式,但它仍然不能正常工作;我认为它在加入之前将每一列视为一个数组,而不是逐行执行函数。我使用的是 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 表格实现这一目标?
最佳答案
请尝试:
=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 部分:过滤数据
-
FILTER(any_columns,ROW(A2:C)<=MAX(IF(LEN(A2:C),ROW(A2:C)*COLUMN(A2:C)^0,0)))
.这是我限制数据范围的方法。 - 范围是开放的,意味着它从第二行开始(
A2
)并且 在任何一行结束。 - 我想在这一步中得到有限的数组,以减少公式应该做的工作。这是通过条件
if
完成的. -
ROW(A2:C)
必须小于或等于最大数据行。MAX(IF(LEN(A2:C), some_rows)
给出最大行数。 -
If(len..
部分检查单元格中是否包含一些文本。 - 备注
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.加入正文
query
公式有 3 个参数:data、query_text 和 number_of_header_rows。data
是用过滤器制成的。query_text
是空的,这相当于全选 ("select *"
)。标题的行数是一个很大的数字 (
2^99
)。 这是一个技巧:当一个query
标题多于一行, 它将用空间加入它们。合并后,
transpose
函数会将结果转换回列。
第 3 部分. 替换和修剪
函数
trim
删除多余的空格。然后我们用分隔符替换空格:
", "
.这就是为什么 如果字符串中有空格,则需要修改公式。正确的 结果:“福特,阿斯顿马丁”。不正确:“福特、阿斯顿、马丁”。但 如果我们之前用一些字符替换空格(char(9)
是 Tab), 那我们这一步不替换。
关于google-sheets - 在 ArrayFormula 中组合文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456012/