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

如何自动生成连续表名组合数组,简化Google Sheets多表QUERY查询

解决方案

方法1:基于年份序列自动合并(推荐,无需脚本)

如果你的工作表都是连续年份命名(比如从2018到当前年份),可以用REDUCE+SEQUENCE+INDIRECT组合实现自动合并,无需手动新增表名:

=QUERY(REDUCE({}, SEQUENCE(YEAR(TODAY())-2018+1, 1, 2018), LAMBDA(acc, year, VSTACK(acc, INDIRECT("'"&year&"'!A:O")))), "")

说明:

  • SEQUENCE(YEAR(TODAY())-2018+1, 1, 2018):生成从2018到当前年份的连续数字序列,新增年份时会自动包含最新年份
  • REDUCE:初始化空数组{},逐个将每个年份工作表的A:O范围通过INDIRECT获取后,用VSTACK堆叠到累加数组中
  • 外层QUERY直接对合并后的大数组执行查询

如果每个工作表都有重复表头,可修改为跳过后续表的表头:

=QUERY(REDUCE(INDIRECT("'2018'!A1:O1"), SEQUENCE(YEAR(TODAY())-2018, 1, 2019), LAMBDA(acc, year, VSTACK(acc, INDIRECT("'"&year&"'!A2:O")))), "")

方法2:自动识别所有年份命名的工作表(需自定义函数)

如果工作表年份不连续,可先获取所有工作表名称,过滤出四位数字格式的年份表,再合并:

  1. 打开Google Sheets的脚本编辑器(工具→脚本编辑器),粘贴以下代码并保存:

    function GET_WORKBOOK_TABS() {
      return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(sheet => sheet.getName());
    }
    
  2. 在单元格中使用以下公式:

    =QUERY(REDUCE({}, FILTER(GET_WORKBOOK_TABS(), REGEXMATCH(GET_WORKBOOK_TABS(), "^\\d{4}$")), LAMBDA(acc, tab, VSTACK(acc, INDIRECT("'"&tab&"'!A:O")))), "")
    

说明:

  • GET_WORKBOOK_TABS():自定义函数返回所有工作表名称
  • FILTER+REGEXMATCH:筛选出仅由四位数字组成的工作表(即年份表)
  • REDUCE+VSTACK:将筛选后的工作表数据逐个堆叠合并

为什么之前的方法失败?

  • INDIRECT仅支持解析单个单元格/范围字符串,无法直接处理'2018'!A:O;'2019'!A:O这种多范围拼接的字符串
  • MAP返回的是数组的数组(每个元素是单个工作表的数据集),而VSTACK需要扁平的序列,REDUCE通过逐步累加的方式解决了嵌套问题

内容的提问来源于stack exchange,提问作者Altay_H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:42:10