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
相关产品推荐
相关产品推荐

