求助:用Google Apps Script合并多工作表至主表,A列存工作表名
解决方案:自动合并多工作表数据(含来源表名+仅取前6条)
方法1:使用动态公式(无需手动填写工作表名)
结合QUERY、MAP、TOCOL等函数,可自动遍历所有工作表,提取前6条数据并添加来源表名:
在目标主工作表(如新建的「主表」)的A1单元格输入以下公式:
=LET( sheets, FILTER(GET_WORKBOOK_NAMES(), NOT(REGEXMATCH(GET_WORKBOOK_NAMES(), "主表|Keyword Sheet"))), data, MAP(sheets, LAMBDA(s, HSTACK(REPT(s, 6), INDIRECT("'"&s&"'!A1:F6")))), TOCOL(data, 1) )
公式说明:
GET_WORKBOOK_NAMES():获取当前文档所有工作表名称FILTER(...):排除无需合并的工作表(这里排除「主表」和「Keyword Sheet」,可按需修改)MAP(sheets, LAMBDA(...)):遍历每个工作表,用HSTACK将来源表名重复6次(对应前6条数据)与该表A1:F6区域合并TOCOL(data, 1):将所有合并数据转为单列堆叠格式,自动忽略空值
若你的工作表数据起始位置或列数不同,可修改INDIRECT("'"&s&"'!A1:F6")中的单元格范围。
方法2:使用Google Apps Script(灵活可控)
如果公式无法满足复杂需求(如跳过表头、处理特殊格式),可采用脚本实现:
- 打开Google Sheets,点击「扩展程序」→「Apps Script」
- 删除默认代码,粘贴以下脚本:
function mergeSheets() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const mainSheet = ss.getSheetByName("主表"); // 主表名称,按需修改 const excludeSheets = ["主表", "Keyword Sheet"]; // 排除的工作表,按需修改 // 清空主表现有数据(如需保留表头,可注释此行) mainSheet.clearContents(); let rowIndex = 1; // 遍历所有工作表 ss.getSheets().forEach(sheet => { const sheetName = sheet.getName(); if (excludeSheets.includes(sheetName)) return; // 获取前6条数据(A列到F列,可修改范围) const data = sheet.getRange(1, 1, 6, 6).getValues(); // 给每条数据添加来源表名 const dataWithSheetName = data.map(row => [sheetName, ...row]); // 写入主表 mainSheet.getRange(rowIndex, 1, dataWithSheetName.length, dataWithSheetName[0].length).setValues(dataWithSheetName); rowIndex += dataWithSheetName.length; }); }
- 保存脚本,点击运行,完成授权后即可执行合并。
脚本说明:
- 修改
excludeSheets数组可调整需排除的工作表 getRange(1, 1, 6, 6)表示从第1行第1列开始取6行6列数据,可按需调整行列数- 若需保留主表表头,可注释
mainSheet.clearContents();并将rowIndex设为2
内容的提问来源于stack exchange,提问作者kueteo
相关产品推荐
相关产品推荐

