如何用Lambda函数堆叠多查询数组并筛选指定行?
多表筛选结果堆叠并保留表头的解决办法
你的原公式为啥没用?
你写的MAP+LAMBDA其实是返回了三个独立的查询结果数组,没把它们合并成一个连贯的大数组。而且VSTACK放在MAP里面,只能处理单个表的结果,没法把多个表的结果叠在一起,这就是问题所在。
两种可行的正确公式
办法1:用REDUCE循环合并(推荐)
这个办法会自动给每个表的筛选结果加上表头,就算某个表没有D列=Y的行,也会保留它的表头:
=REDUCE("", {"Table1";"Table2";"Table3"}, LAMBDA(acc, tab, VSTACK(acc, INDIRECT(tab)&"!A1:D1", // 取当前表的表头 QUERY(INDIRECT(tab), "select * where Col4='Y' offset 1") // 筛D列=Y的行,跳过原表头避免重复 ) ))
注:加
offset 1是因为已经单独取了表头,不然查询结果会自带表头,导致重复显示。
办法2:MAP加外层VSTACK(支持加分隔空行)
要是你想在不同表的结果之间加个空行分隔,可以用这个:
=VSTACK( MAP({"Table1";"Table2";"Table3"}, LAMBDA(tab, VSTACK( INDIRECT(tab)&"!A1:D1", QUERY(INDIRECT(tab), "select * where Col4='Y' offset 1"), {"","","",""} // 这里是空行,不想加就删掉这一行 ) )) )
示例效果参考
假设:
- Table1有2行D列值为Y,Table2有1行,Table3没有符合条件的行
用办法1得到的结果会是:
- Table1表头 + 2行符合条件的数据
- Table2表头 + 1行符合条件的数据
- Table3表头
用办法2的话,每个表的结果后面会多一行空的分隔行。
内容的提问来源于stack exchange,提问作者game01 gamer
相关产品推荐
相关产品推荐

