如何在Google Sheets中用动态查询自动导入指定表格的所有工作表数据
解决方案:Google Sheets自动导入指定表格全部工作表数据
原生IMPORTRANGE函数本身不支持自动识别源表格内的新增工作表,你可以搭配Google Apps Script实现需求,无需每天手动修改查询规则。
实现思路
- 通过Apps Script自动拉取源表格的所有工作表名称
- 自动拼接所有工作表的数据,合并后写入目标汇总表,或生成动态查询公式
- 搭配定时触发器实现自动更新,新增工作表无需调整任何配置
方案1:脚本静态同步(适合大数据量场景,稳定性高)
操作步骤
- 打开你的目标汇总表格,点击顶部菜单栏「扩展程序」-「Apps Script」打开脚本编辑器
- 删除编辑器内默认的空代码,粘贴如下代码:
// 按需修改下方三个参数即可 const SOURCE_SPREADSHEET_ID = "替换为源表格ID(从源表格URL中提取)"; const HEADER_ROW_COUNT = 1; // 源表表头占几行就填几行,默认1行 const TARGET_SHEET_NAME = "汇总表"; // 数据写入目标表格的哪个工作表 function autoImportAllSheets() { // 获取源表格所有工作表 const sourceSs = SpreadsheetApp.openById(SOURCE_SPREADSHEET_ID); const allSourceSheets = sourceSs.getSheets(); let mergedData = []; allSourceSheets.forEach(sheet => { // 如果有不需要汇总的工作表,可在此处添加跳过逻辑,示例:if(sheet.getName() === "测试表") return; const sheetData = sheet.getDataRange().getValues(); // 仅第一个表保留表头,其余表跳过表头行 if(mergedData.length === 0) { mergedData = mergedData.concat(sheetData); } else { mergedData = mergedData.concat(sheetData.slice(HEADER_ROW_COUNT)); } }) // 写入目标表 const targetSs = SpreadsheetApp.getActiveSpreadsheet(); const targetSheet = targetSs.getSheetByName(TARGET_SHEET_NAME) || targetSs.insertSheet(TARGET_SHEET_NAME); targetSheet.clearContents(); targetSheet.getRange(1, 1, mergedData.length, mergedData[0].length).setValues(mergedData); }
- 修改代码开头的三个自定义参数,保存项目并自定义项目名
- 首次运行需要授权,按提示操作即可(提示未验证应用属于正常情况,点击「高级」-「继续访问」即可,脚本为你自行编写无安全风险)
- 如需自动更新无需手动运行:点击脚本编辑器左侧「触发器」按钮,添加触发器,选择
autoImportAllSheets函数,触发类型选「时间驱动」,可按需设置按天/按小时/分钟级别的更新频率
方案2:自定义函数+公式动态同步(适合小数据量场景,无需配置触发器)
如果数据量在1000行以内,你可以用轻量的自定义函数+公式实现:
- 打开Apps Script,粘贴如下自定义函数代码:
function GET_ALL_SHEET_NAMES(spreadsheetId) { const ss = SpreadsheetApp.openById(spreadsheetId); return ss.getSheets().map(sheet => sheet.getName()); }
- 保存授权后,在目标表的任意单元格输入如下公式即可:
=QUERY(REDUCE(,GET_ALL_SHEET_NAMES("替换为源表格ID"),LAMBDA(acc,cur,{acc;IMPORTRANGE("替换为源表格ID",cur&"!A:Z")})),"WHERE Col1 IS NOT NULL",1)
该公式会自动获取所有工作表名称、拼接多表数据、自动过滤空行、保留1行表头,新增工作表后刷新表格即可自动导入新数据。
注意事项
- 脚本运行的Google账号需要拥有源表格的查看/编辑权限
- 如需排除特定工作表不参与汇总,在方案1的跳过逻辑处添加对应表名判断即可
内容的提问来源于stack exchange,提问作者Seth Garrison
相关产品推荐
相关产品推荐

