如何基于公共字段合并多个Google Sheet列实现汇总表自动更新
Google Sheets多表内连接汇总最优方案
方案一:原生公式方案(适合数据量<1000行,零代码开箱即用)
核心采用内连接逻辑保证仅同步所有源表都存在的ID数据,自动去重重复字段,实时自动更新。
前置准备
确认所有源表的共同连接键(如邮箱ID)均为同一列,表头统一在第1行,以下示例用3张源表:表1「用户反馈表」、表2「用户信息表」、表3「员工绩效表」,可根据实际表数量直接扩展规则。
实现步骤
- 提取符合条件的唯一ID
在汇总表A2单元格输入公式,自动筛选出所有源表都存在的ID,源表新增符合条件的ID会自动同步:
=UNIQUE(FILTER('用户反馈表'!A:A, COUNTIF('用户信息表'!A:A, '用户反馈表'!A:A)>0, COUNTIF('员工绩效表'!A:A, '用户反馈表'!A:A)>0))
- 生成去重汇总表头
在汇总表A1单元格输入公式,自动拼接所有源表字段,重复字段(如连接键邮箱)仅保留1次:
=UNIQUE({'用户反馈表'!1:1,'用户信息表'!1:1,'员工绩效表'!1:1})
- 匹配全字段数据
在汇总表B2单元格输入数组公式,自动匹配每个ID对应的所有维度数据:
=ARRAYFORMULA(IF(A2:A="",, HSTACK( XLOOKUP(A2:A,'用户反馈表'!A:A,'用户反馈表'!B:Z,""), XLOOKUP(A2:A,'用户信息表'!A:A,FILTER('用户信息表'!B:Z,NOT(COUNTIF('用户反馈表'!1:1,'用户信息表'!1:1))),""), XLOOKUP(A2:A,'员工绩效表'!A:A,FILTER('员工绩效表'!B:Z,NOT(COUNTIF({'用户反馈表'!1:1,'用户信息表'!1:1},'员工绩效表'!1:1))), "") )))
方案二:Apps Script方案(适合数据量>1000行,自定义扩展性强)
数据量大时公式容易卡顿,用脚本+触发器实现秒级自动更新,稳定性更高。
实现步骤
- 点击汇总表顶部菜单栏「扩展程序」-「Apps Script」,删除默认代码后粘贴以下代码:
function mergeAllSheets() { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 配置源表名称、连接键列索引(A列为0) const sourceSheets = ['用户反馈表','用户信息表','员工绩效表']; const joinKeyCol = 0; // 收集所有源表数据 let allData = {}; let allHeaders = new Set(); sourceSheets.forEach(sheetName => { const sheet = ss.getSheetByName(sheetName); const [headers, ...rows] = sheet.getDataRange().getValues(); // 记录所有表头 headers.forEach(h => allHeaders.add(h)); // 存储每行数据 rows.forEach(row => { const key = row[joinKeyCol]; if (!allData[key]) allData[key] = {}; headers.forEach((h, idx) => { allData[key][h] = row[idx]; }) }) }); // 筛选所有源表都存在的ID const validKeys = Object.keys(allData).filter(key => { return sourceSheets.every(sheetName => { const sheet = ss.getSheetByName(sheetName); const keys = sheet.getRange(2, joinKeyCol+1, sheet.getLastRow()-1,1).getValues().flat(); return keys.includes(key); }) }); // 生成输出数据 const headerArr = Array.from(allHeaders); const output = [headerArr]; validKeys.forEach(key => { const row = headerArr.map(h => allData[key][h] || ''); output.push(row); }) // 写入汇总表 const targetSheet = ss.getSheetByName('汇总表'); targetSheet.clearContents(); targetSheet.getRange(1,1,output.length, output[0].length).setValues(output); }
- 点击左侧「触发器」-「添加触发器」,选择
mergeAllSheets函数,触发事件选择「电子表格」-「更改」,保存后只要任意源表有修改,汇总表就会自动更新。
注意事项
- 所有源表的连接键需保证无重复值,避免匹配异常
- 公式方案不要手动修改汇总表的自动溢出区域内容,避免覆盖公式计算结果
- 脚本方案可根据需求扩展校验规则、新增源表,只需修改
sourceSheets配置即可
内容的提问来源于stack exchange,提问作者RRM
相关产品推荐
相关产品推荐

