如何修复Google Sheets脚本实现复制源表独有范围到目标表且跳过表头
修复后可用脚本
function keepUnique(){ // 配置项,可根据实际表格情况调整 const idCol = 0; // 作为去重依据的A列,对应数组索引0 const headerRows = 2; // 源表和目标表的表头行数,前N行表头不参与去重判断 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName("source"); const targetSheet = ss.getSheetByName("target"); // 读取目标表已存在的ID,存入Set提升比对效率 const targetLastRow = targetSheet.getLastRow(); const existIds = new Set(); if (targetLastRow > headerRows) { const existIdRange = targetSheet.getRange(headerRows + 1, idCol + 1, targetLastRow - headerRows, 1); existIdRange.getValues().flat().forEach(id => existIds.add(id)); } // 读取源表全量数据 const sourceData = sourceSheet.getDataRange().getValues(); const newRows = []; // 跳过表头遍历源表数据 for (let i = headerRows; i < sourceData.length; i++) { const currentId = sourceData[i][idCol]; // 跳过ID为空、以及目标表已存在的行 if (!currentId || existIds.has(currentId)) continue; // 存入整行完整数据 newRows.push(sourceData[i]); // 新增ID存入集合,避免源表内部重复ID被多次写入 existIds.add(currentId); } // 仅存在新增数据时执行写入操作 if (newRows.length > 0) { const targetStartRow = targetLastRow > 0 ? targetLastRow + 1 : headerRows + 1; targetSheet.getRange(targetStartRow, 1, newRows.length, newRows[0].length).setValues(newRows); } }
核心改动说明
- 新增目标表已有ID读取逻辑,严格以A列ID为唯一判断依据,避免重复数据写入
- 不再仅提取单列ID,保留整行完整内容写入目标表
- 改用Set结构存储ID比对,相比原有嵌套循环效率更高,适配SQL插件持续刷新的大数据量场景
- 新增空数据校验逻辑,无新增数据时不会触发写入操作,避免脚本运行报错
- 写入逻辑改为追加到目标表已有数据末尾,不会覆盖目标表原有内容
- 新增可调整的表头行数配置项,适配不同的表格结构
内容的提问来源于stack exchange,提问作者Juan Portillo
相关产品推荐
相关产品推荐

