You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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),比嵌套循环遍历更高效,尤其适合数据量较大的表格。

使用步骤

  1. 打开你的Google表格,点击顶部菜单栏的「扩展程序」→「Apps 脚本」。
  2. 删除默认的myFunction,粘贴上述代码。
  3. 点击保存按钮,给脚本命名(比如「ReplaceRowsByID」)。
  4. 点击运行按钮,首次运行需授权脚本访问你的表格数据,按照提示完成授权即可。

内容的提问来源于stack exchange,提问作者Oliver Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:40:17