如何用Google Apps Script合并不同列名的实质相同数据列?
实现方案
核心思路
先定义列名映射规则(把不同团队的同义列名对应到中央表的统一列名),然后遍历各团队表格,根据映射提取对应列的数据,最后汇总到中央追踪表。
具体代码示例
假设你的Google Sheets里有:
- 中央表:命名为
中央追踪表,统一列名为项目名称 - 甲团队表:命名为
甲团队表,列名project name - 乙团队表:命名为
乙团队表,列名Initiative Name
以下是可直接复用的脚本:
function mergeSameColumns() { // 获取当前Spreadsheet实例 const ss = SpreadsheetApp.getActiveSpreadsheet(); // 定义列名映射:key是中央表列名,value是各团队表的对应列名数组 const columnMap = { '项目名称': ['project name', 'Initiative Name'] // 可继续添加其他同义列名 }; // 获取中央表并处理表头与旧数据 const centralSheet = ss.getSheetByName('中央追踪表'); if (!centralSheet) { // 中央表不存在则新建并写入表头 centralSheet = ss.insertSheet('中央追踪表'); centralSheet.getRange(1, 1, 1, Object.keys(columnMap).length).setValues([Object.keys(columnMap)]); } else { // 清空表头以外的旧数据 centralSheet.getRange(2, 1, centralSheet.getLastRow() - 1, centralSheet.getLastColumn()).clearContent(); } // 定义需要处理的团队表名称列表 const teamSheetNames = ['甲团队表', '乙团队表']; // 可添加更多团队表 // 遍历每个团队表提取数据 let mergedData = []; teamSheetNames.forEach(sheetName => { const teamSheet = ss.getSheetByName(sheetName); if (!teamSheet) return; // 表不存在则跳过 // 获取该表的表头行 const headers = teamSheet.getRange(1, 1, 1, teamSheet.getLastColumn()).getValues()[0]; // 匹配对应列并提取数据 Object.keys(columnMap).forEach(centralColName => { const matchedIndex = headers.findIndex(header => columnMap[centralColName].includes(header.trim().toLowerCase()) ); if (matchedIndex !== -1) { const colData = teamSheet.getRange(2, matchedIndex + 1, teamSheet.getLastRow() - 1, 1).getValues(); colData.forEach((cell, idx) => { if (!mergedData[idx]) mergedData[idx] = []; mergedData[idx].push(cell[0]); }); } else { // 未找到对应列时填充空值 for (let i = 0; i < teamSheet.getLastRow() - 1; i++) { if (!mergedData[i]) mergedData[i] = []; mergedData[i].push(''); } } }); }); // 将合并后的数据写入中央表 if (mergedData.length > 0) { centralSheet.getRange(2, 1, mergedData.length, mergedData[0].length).setValues(mergedData); } SpreadsheetApp.getUi().alert('数据合并完成!'); }
使用说明
- 打开目标Google Sheets,点击顶部菜单
扩展程序 > Apps 脚本 - 把上述代码粘贴到脚本编辑器,替换默认代码
- 根据实际表格名称、列名,修改
columnMap和teamSheetNames的内容 - 点击工具栏运行按钮,首次运行按提示完成授权即可
注意事项
- 列名匹配支持大小写忽略+去空格,比如
Project Name和project name会被识别为同一列 - 若某团队表无对应列,会自动填充空值,不破坏整体数据结构
- 如需合并多字段(如项目名称+负责人+进度),只需在
columnMap中添加对应映射,示例:const columnMap = { '项目名称': ['project name', 'Initiative Name'], '负责人': ['Owner', '负责人', '对接人'], '进度': ['Progress', '完成百分比'] };
内容的提问来源于stack exchange,提问作者Mooskaar
相关产品推荐
相关产品推荐

