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

Apps Script多表汇总追加行前检测删除重复行实现咨询

Apps Script 前置去重修改方案

核心实现逻辑

  • 先读取汇总总表的现有全量数据,提取每行的去重唯一标识存入Set对象,利用Set的O(1)查询能力实现快速重复校验
  • 对从各源表提取到的新行批量做校验,仅保留唯一标识不在Set中的非重复行
  • 最终仅将过滤后的非重复行追加到总表,不需要事后全表扫描去重,性能比后置去重更高

代码修改示例

你可以对照你现有copyAndAddNewEntries函数的逻辑,插入下面的去重过滤逻辑即可,完整示例如下:

function copyAndAddNewEntries() {
  // 1. 先获取汇总总表的现有数据,生成去重校验用的Set
  const summarySs = SpreadsheetApp.openById('你的汇总表ID');
  const summarySheet = summarySs.getSheetByName('汇总工作表名');
  const summaryLastRow = summarySheet.getLastRow();
  const existingUniqueSet = new Set();
  const HEADER_ROW_COUNT = 1; // 汇总表表头行数,有几行就填几行,不需要校验表头重复

  // 如果总表有数据,就把现有行的唯一标识存入Set
  if (summaryLastRow > HEADER_ROW_COUNT) {
    const existingRows = summarySheet.getRange(HEADER_ROW_COUNT + 1, 1, summaryLastRow - HEADER_ROW_COUNT, summarySheet.getLastColumn()).getValues();
    existingRows.forEach(row => {
      // --- 这里自定义去重规则:以下示例是用第1列+第3列+第5列作为重复判断依据,你可以按需修改
      // 如果要整行判断重复,直接写成 row.join('||') 即可
      const uniqueKey = `${row[0]}||${row[2]}||${row[4]}`;
      existingUniqueSet.add(uniqueKey);
    });
  }

  // 2. 你原来的从各源表提取新行的逻辑,这里假设提取后存在newRows数组里
  // (以下是你原有逻辑的示例,替换成你自己的提取代码即可)
  const sourceSsList = ['源表1ID', '源表2ID']; // 你的源表ID列表
  const sourceSheetName = '源数据工作表名'; // 源表要提取的工作表名
  let newRows = [];
  sourceSsList.forEach(ssId => {
    const sourceSs = SpreadsheetApp.openById(ssId);
    const sourceSheet = sourceSs.getSheetByName(sourceSheetName);
    const sourceRows = sourceSheet.getRange(2, 1, sourceSheet.getLastRow() - 1, sourceSheet.getLastColumn()).getValues();
    newRows = newRows.concat(sourceRows);
  });

  // 3. 对新提取的行做去重过滤,只保留不在现有Set里的行
  const filteredNewRows = newRows.filter(row => {
    // 这里的uniqueKey生成规则要和上面总表的规则完全一致
    const uniqueKey = `${row[0]}||${row[2]}||${row[4]}`;
    if (!existingUniqueSet.has(uniqueKey)) {
      // 把新的唯一标识也加入Set,避免本次提取的新行内部有重复
      existingUniqueSet.add(uniqueKey);
      return true;
    }
    return false;
  });

  // 4. 仅追加过滤后的非重复行到总表
  if (filteredNewRows.length > 0) {
    summarySheet.getRange(summaryLastRow + 1, 1, filteredNewRows.length, filteredNewRows[0].length).setValues(filteredNewRows);
  }
}

注意事项

  • 生成唯一标识的拼接符||建议替换为不会出现在你业务数据中的特殊字符,避免不同列内容拼接后意外相同导致误判
  • 如果汇总表数据量超过10万行,可按日期/分类分批读取数据生成Set,避免单次读取内存占用过高
  • 代码里的去重规则可以灵活调整,比如仅用订单号/手机号这类唯一值列作为判断依据,不需要拼接多列

内容的提问来源于stack exchange,提问作者Bob Hardball

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:45:04