Google Sheet多工作表列名相同位置不同 按列名合并生成总表
Google Sheet多表按列名动态合并解决方案
公式方案(适合表数量不多、数据量较小的场景)
无需手动匹配列位置,只要各工作表的表头拼写和id、date、amount完全一致即可自动适配,操作步骤:
- 在总表(Master)的空白列(比如D列)依次填写所有需要合并的工作表名称,不要包含Master表本身
- 在Master表A1单元格输入
={"id","date","amount"}设置固定总表头 - 在A2单元格输入如下公式即可自动生成全部合并数据:
=REDUCE({"","",""}, D1:D, LAMBDA(acc, sheet_name, IF(sheet_name="", acc, LET(header_row, INDIRECT("'"&sheet_name&"'!1:1"),id_col, XMATCH("id", header_row, 0),date_col, XMATCH("date", header_row, 0),amount_col, XMATCH("amount", header_row, 0),data_range, INDIRECT("'"&sheet_name&"'!A2:"&ADDRESS(ROWS(INDIRECT("'"&sheet_name&"'!A:A")), MAX(id_col, date_col, amount_col))),filtered, FILTER(CHOOSECOLS(data_range, id_col, date_col, amount_col), CHOOSECOLS(data_range, id_col)<>""),VSTACK(acc, filtered))))
公式逻辑:遍历所有指定工作表,先在对应表的第一行匹配三个字段的列索引,再按指定顺序提取对应列数据,跳过空行后汇总,完全不依赖固定列号。
脚本方案(适合表数量多、数据量大的场景)
如果公式加载卡顿,可以用Apps Script实现,一次配置后续可一键刷新:
- 点击顶部菜单栏「扩展程序」>「Apps Script」进入脚本编辑器
- 替换默认代码为以下内容:
function mergeSheetsToMaster() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const allSheets = ss.getSheets(); const targetFields = ['id', 'date', 'amount']; const mergeResult = [targetFields]; allSheets.forEach(sheet => { // 跳过Master总表本身 if (sheet.getName() === 'Master') return; const sheetData = sheet.getDataRange().getValues(); const header = sheetData[0].map(item => item.trim()); // 匹配三个字段对应的列索引 const colIndexMap = targetFields.map(field => header.indexOf(field)); // 逐行提取数据,跳过空行 for (let i = 1; i < sheetData.length; i++) { const row = colIndexMap.map(idx => idx > -1 ? sheetData[i][idx] : ''); if (row[0]) mergeResult.push(row); } }); // 写入总表,不存在则自动创建 const masterSheet = ss.getSheetByName('Master') || ss.insertSheet('Master'); masterSheet.clearContents(); masterSheet.getRange(1, 1, mergeResult.length, mergeResult[0].length).setValues(mergeResult); }
- 保存代码后点击运行,完成权限授权即可生成总表。后续各工作表数据更新后,重新运行一次脚本即可刷新总表数据。
注意事项
- 所有工作表的表头需保证拼写和
id、date、amount完全一致,不要有多余空格或大小写差异 - 如果表头不在工作表的第一行,可对应调整公式/脚本里的表头行参数即可
内容的提问来源于stack exchange,提问作者David Kadishvitz
相关产品推荐
相关产品推荐

