如何自动生成连续表名组合数组,简化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:自动识别所有年份命名的工作表(需自定义函数)
如果工作表年份不连续,可先获取所有工作表名称,过滤出四位数字格式的年份表,再合并:
打开Google Sheets的脚本编辑器(工具→脚本编辑器),粘贴以下代码并保存:
function GET_WORKBOOK_TABS() { return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(sheet => sheet.getName()); }在单元格中使用以下公式:
=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
相关产品推荐
相关产品推荐

