在Google Sheets中结合ARRAYFORMULA与QUERY处理条件过滤数据集
问题描述
我正在处理员工加班申请数据,具体需求与表格情况如下:
表格说明
- 原始表格包含
ID(A列)、NAME(B列)、DUPLICATE(F列)、IS MET(I列)等列:A-D列是Google Forms收集的加班申请信息;F列标记请求是否为重复项;I列判断请求是否有效。 - 需求:当I列(IS MET)为
TRUE时,根据A列的请求ID提取F列(DUPLICATE)为"NO"的非重复记录中的姓名,转置到Name 1、Name 2等新列,最终按ID分组展示对应非重复姓名。
当前问题
单行公式(J3单元格)可实现需求:
=IF(I3=FALSE,"",TRANSPOSE(QUERY(FILTER($A$3:$I,$A$3:$A=A3,$F$3:$F="NO"),"SELECT Col2",0)))
但尝试用ARRAYFORMULA实现自动逐行执行(支持新增行)时,以下公式未得到预期结果:
=ARRAYFORMULA(IF(I3:I=FALSE,"",TRANSPOSE(QUERY(FILTER($A$3:$I,$A$3:$A=A3:A,$F$3:$F="NO"),"SELECT Col2",0))))
解决方案
问题出在TRANSPOSE和QUERY无法直接配合ARRAYFORMULA完成逐行的ID匹配与转置。可以使用BYROW函数迭代每一行数据,结合原有逻辑实现自动扩展:
=BYROW(A3:I, LAMBDA(row, IF(INDEX(row,9)=FALSE,"", TRANSPOSE(QUERY(FILTER(A:I, A:A=INDEX(row,1), F:F="NO"),"SELECT Col2",0)) ) ))
公式说明
BYROW(A3:I, LAMBDA(row, ...)):遍历A3开始的每一行数据,将当前行作为row参数传入Lambda函数。INDEX(row,9):获取当前行的第9列(即I列的IS MET值),若为FALSE则返回空值。- 当
IS MET为TRUE时,用FILTER(A:I, A:A=INDEX(row,1), F:F="NO")筛选出当前ID对应的所有非重复记录,再通过QUERY提取姓名列(Col2即B列),最后TRANSPOSE转置为横向输出。
兼容旧版Google Sheets的替代方案
如果你的Google Sheets版本不支持BYROW,可以用ARRAYFORMULA结合聚合拆分的方式实现:
=ARRAYFORMULA(IF(I3:I=FALSE,"", SPLIT(TEXTJOIN("|", TRUE, IF((A3:A=A3:A)*(F3:F="NO"), B3:B, "")), "|") ))
注意:需确保姓名中不含分隔符|,若有可替换为其他无冲突字符。
内容的提问来源于stack exchange,提问作者Diasrepo
相关产品推荐
相关产品推荐

