如何在Google Sheets的QUERY函数中使用动态数组合并多工作表数据
解决方案
你之前方案失败的核心原因:JOIN生成的是纯文本字符串,而QUERY的第一参数要求的是实际的单元格区域/数组对象,表格公式不会自动解析文本内容里的区域语法、数组语法为可调用的引用,所以两种尝试都不生效。
方案1:半动态配置(无需脚本,适合大多数场景)
你只需要提前维护一个待合并工作表名称列表,后续新增工作表只需要往列表里加名称即可,无需修改QUERY主公式:
- 在SheetA的空白列(比如B列),逐行填写需要合并的工作表名称:
- B1填
Sheet1 - B2填
Sheet2 - 后续新增工作表直接在B列空白行加表名即可
- B1填
- 在SheetA需要输出合并结果的单元格输入公式:
=QUERY(REDUCE(, B:B, LAMBDA(acc, cur_name, IF(cur_name="", acc, VSTACK(acc, INDIRECT(cur_name&"!A1:D13"))))), "select * where [你的筛选条件]", 1)
- 参数说明:
REDUCE会遍历B列所有表名,逐一把对应工作表的A1:D13区域堆叠到结果数组中INDIRECT作用是把拼接好的区域文本转为实际的单元格引用- 公式末尾的
1代表合并的区域自带1行表头,如果你不需要保留表头可改为0,筛选条件按你原有需求修改即可
方案2:全自动动态识别(需要自定义脚本,新增表无需任何手动操作)
如果不想手动维护表名列表,可以通过谷歌表格的Apps Script写自定义函数自动拉取所有待合并工作表名称:
- 点击表格顶部菜单栏「扩展程序」-「Apps Script」,删除默认代码后粘贴以下内容:
function GET_MERGE_SHEETS() { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 这里排除当前汇总表SheetA,你可以按需修改排除规则 return ss.getSheets().filter(item => item.getName() !== "SheetA").map(item => item.getName()); }
- 保存项目后回到表格,在SheetA的B1单元格输入
=GET_MERGE_SHEETS(),会自动生成所有待合并的工作表名称列表 - 后续新增工作表后,只要刷新页面就会自动更新表名列表,QUERY公式无需任何修改
内容的提问来源于stack exchange,提问作者Eddie
相关产品推荐
相关产品推荐

