You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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))
  )
))

公式说明

  1. BYROW(A3:I, LAMBDA(row, ...)):遍历A3开始的每一行数据,将当前行作为row参数传入Lambda函数。
  2. INDEX(row,9):获取当前行的第9列(即I列的IS MET值),若为FALSE则返回空值。
  3. 当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:14:52