如何通过ID列匹配替换两张Sheet中的行 - App Script
用Google Apps Script实现按唯一ID替换Sheet行数据
实现思路
先将Source表的数据按唯一ID(AJ列)整理成键值对映射,再遍历Target表的每一行,匹配到对应ID时直接用Source的行数据替换,最后将处理后的结果写回Target表。这种方式能减少表格读写次数,提升执行效率。
完整代码
function replaceRowsByID() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName('Source'); const targetSheet = ss.getSheetByName('Target'); // 获取Source表所有数据(包含表头),AJ列是第36列,数组索引为35 const sourceData = sourceSheet.getDataRange().getValues(); // 获取Target表所有数据 const targetData = targetSheet.getDataRange().getValues(); // 创建Source数据的ID映射,键为ID,值为整行数据 const sourceMap = new Map(); // 跳过表头,从第二行开始遍历(索引1) for (let i = 1; i < sourceData.length; i++) { const row = sourceData[i]; const id = row[35]; // AJ列的索引是35(数组从0开始计数) if (id) { // 确保ID不为空 sourceMap.set(id, row); } } // 处理Target数据:匹配ID则替换行 for (let i = 1; i < targetData.length; i++) { const targetRow = targetData[i]; const targetId = targetRow[35]; if (sourceMap.has(targetId)) { // 用Source的行替换当前Target行 targetData[i] = sourceMap.get(targetId); } // 无匹配则保留原行,无需操作 } // 将处理后的数据写回Target表,覆盖原有内容 targetSheet.getRange(1, 1, targetData.length, targetData[0].length).setValues(targetData); SpreadsheetApp.getUi().alert('替换完成!'); }
关键说明
- 索引对应:AJ列是第36列,在数组中索引为35(因为JavaScript数组从0开始计数),如果后续列有调整,需修改此索引值。
- 跳过表头:代码默认表头在第一行,所以遍历从索引1开始;如果表头行数不同,需调整循环起始值。
- 空ID处理:跳过Source表中ID为空的行,避免无效映射。
- 效率优化:使用
Map存储ID与行数据的映射,查找匹配的时间复杂度为O(1),比嵌套循环遍历更高效,尤其适合数据量较大的表格。
使用步骤
- 打开你的Google表格,点击顶部菜单栏的「扩展程序」→「Apps 脚本」。
- 删除默认的
myFunction,粘贴上述代码。 - 点击保存按钮,给脚本命名(比如「ReplaceRowsByID」)。
- 点击运行按钮,首次运行需授权脚本访问你的表格数据,按照提示完成授权即可。
内容的提问来源于stack exchange,提问作者Oliver Yu
相关产品推荐
相关产品推荐

