将QUERY()传入Google Sheets LAMBDA函数的参数错误问题排查
Google Sheets:拆分QUERY过滤后CSV列的实现方案
问题背景
需要从Alias Key Raw工作表提取两列数据,通过QUERY过滤出Key列以X开头的行,再将第二列的CSV格式谱系文本拆分,最终保留Key列,拆分后的谱系按列展开。尝试了以下公式均失败:
- 公式:
=lambda(a, b, split(b, ","))(query('Alias Key Raw'!A1:B, "select * where A starts with 'X'"))
报错:ERROR Wrong number of arguments to call following LAMBDA function. Expected 2 arguments, but got 1 arguments.
原因:QUERY返回的是二维数组(多行两列),但该LAMBDA需要两个独立参数,数组被当作单个参数传入,导致参数数量不匹配。
- 公式:
=byrow(query('Alias Key Raw'!A1:B, "select * where A starts with 'X'"), lambda(row, split(row, ",")))
问题:仅返回Key列,Lineages列的拆分结果被忽略。
原因:直接对整行执行split,未指定拆分Lineages列,导致只保留了无逗号的Key值。
输入数据
| Key | Lineages |
|---|---|
| CU | B.1.1.529.5.1.26 |
| CV | B.1.1.529.2.75.3.1.1.3 |
| XA | B.1.1.7,B.1.177 |
| XB | B.1.634,B.1.631 |
| XC | AY.29,B.1.1.7 |
| XAZ | BA.2.5,BA.5,BA.2.5 |
| XBC | BA.2*,B.1.617.2*,BA.2*,B.1.617.2* |
预期输出
| Key | Lineages | |||
|---|---|---|---|---|
| XA | B.1.1.7 | B.1.177 | ||
| XB | B.1.634 | B.1.631 | ||
| XC | AY.29 | B.1.1.7 | ||
| XAZ | BA.2.5 | BA.5 | BA.2.5 | |
| XBC | BA.2* | B.1.617.2* | BA.2* | B.1.617.2* |
解决方案
方案1:使用MAP+LET函数(推荐,代码简洁高效)
=LET( filtered_data, QUERY('Alias Key Raw'!A1:B, "select * where A starts with 'X'"), MAP( INDEX(filtered_data, 0, 1), INDEX(filtered_data, 0, 2), LAMBDA(k, l, {k, SPLIT(l, ",")}) ) )
LET定义变量filtered_data存储QUERY结果,避免重复调用查询。INDEX(filtered_data, 0, 1)提取过滤后的Key列,INDEX(filtered_data, 0, 2)提取Lineages列。MAP遍历两行数据,将每行的Key和Lineages传入LAMBDA,拆分后横向拼接成一行。
方案2:使用BYROW函数
=BYROW( QUERY('Alias Key Raw'!A1:B, "select * where A starts with 'X'"), LAMBDA(row, {INDEX(row, 1), SPLIT(INDEX(row, 2), ",")}) )
BYROW遍历过滤后的每一行,用INDEX(row,1)获取当前行的Key,INDEX(row,2)获取Lineages列。- 拆分Lineages后与Key拼接,生成包含Key和拆分后谱系的行。
内容的提问来源于stack exchange,提问作者Christopher Rucinski
相关产品推荐
相关产品推荐

