在 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 张来实现此目的?
请尝试:
=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. 过滤数据
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
为 1 的列。 编辑。现在注意到,
该公式在没有 *COLUMN(A2:C)^0
的情况下也能正常工作,所以它是
矫枉过正。
第2部分.加入正文
query
公式有 3 个参数:数据、query_text 和一个 number_of_header_rows。
data
是用滤镜制作的
query_text
是空的,这相当于 select 全部
("select *"
).
而 header 的行数是一个很大的数字 (2^99
)。
这是一个技巧:当 query
比一行多 header 时,
它将加入 space.
合并后,transpose
函数会将结果转换回列。
第 3 部分. 替换和 trim
函数trim
删除多余的space。
然后我们将spaces替换为分隔符:", "
。这就是为什么
如果 spaces 是字符串,则需要修改公式。正确的
结果:"Ford, Aston Martin"。不正确:"Ford, Aston, Martin"。但
如果我们之前用一些字符替换 spaces(char(9)
是 Tab),
那我们这一步就不替换了。
我有一个 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 张来实现此目的?
请尝试:
=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. 过滤数据
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
为 1 的列。 编辑。现在注意到, 该公式在没有*COLUMN(A2:C)^0
的情况下也能正常工作,所以它是 矫枉过正。
第2部分.加入正文
query
公式有 3 个参数:数据、query_text 和一个 number_of_header_rows。data
是用滤镜制作的query_text
是空的,这相当于 select 全部 ("select *"
).而 header 的行数是一个很大的数字 (
2^99
)。 这是一个技巧:当query
比一行多 header 时, 它将加入 space.合并后,
transpose
函数会将结果转换回列。
第 3 部分. 替换和 trim
函数
trim
删除多余的space。然后我们将spaces替换为分隔符:
", "
。这就是为什么 如果 spaces 是字符串,则需要修改公式。正确的 结果:"Ford, Aston Martin"。不正确:"Ford, Aston, Martin"。但 如果我们之前用一些字符替换 spaces(char(9)
是 Tab), 那我们这一步就不替换了。