Google Sheets Apps Script 按A列ID去重复制源表数据到目标表并定时运行
Google Sheets 跨表唯一数据自动追加实现方案
一、修正后完整代码
针对你的需求优化了逻辑,解决了原代码未对比目标表已有ID、覆盖原有数据、查询效率低的问题:
function keepUnique(){ // 可根据实际业务调整配置项 const UNIQUE_COL_INDEX = 0; // 唯一ID对应的列索引,A列对应0 const SOURCE_SHEET_NAME = "source"; const TARGET_SHEET_NAME = "target"; const SOURCE_HAS_HEADER = true; // source表是否有表头,是则跳过第一行 const TARGET_HEADER_ROWS = 2; // target表表头占用行数,数据从N+1行开始写入 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName(SOURCE_SHEET_NAME); const targetSheet = ss.getSheetByName(TARGET_SHEET_NAME); // 提前拉取target表所有已有ID存入Set,重复判断效率远高于双层循环 const existIds = new Set(); const targetLastRow = targetSheet.getLastRow(); if (targetLastRow > TARGET_HEADER_ROWS) { const targetIdRange = targetSheet.getRange(TARGET_HEADER_ROWS + 1, UNIQUE_COL_INDEX + 1, targetLastRow - TARGET_HEADER_ROWS, 1); targetIdRange.getValues().flat().forEach(id => existIds.add(id)); } // 拉取source表全量数据 const sourceAllData = sourceSheet.getDataRange().getValues(); const startRow = SOURCE_HAS_HEADER ? 1 : 0; const newRows = []; // 筛选ID未在target出现的新增行 for (let i = startRow; i < sourceAllData.length; i++) { const row = sourceAllData[i]; const currentId = row[UNIQUE_COL_INDEX]; if (currentId && !existIds.has(currentId)) { newRows.push(row); // 若仅需保留A列ID,修改为 newRows.push([currentId]) existIds.add(currentId); // 同时跳过source表内部的重复ID行 } } // 无新增数据直接结束运行 if (newRows.length === 0) return; // 新增数据追加到target表底部,不覆盖原有内容 const targetInsertRow = targetLastRow > 0 ? targetLastRow + 1 : TARGET_HEADER_ROWS + 1; targetSheet.getRange(targetInsertRow, 1, newRows.length, newRows[0].length).setValues(newRows); }
二、凌晨定时运行设置步骤
- 打开对应Google Sheets,点击顶部菜单栏「扩展程序」->「Apps 脚本」进入脚本编辑器
- 保存上述代码后,点击编辑器左侧侧边栏的「触发」(时钟样式图标)
- 点击右下角「添加触发」按钮,按以下参数配置:
- 选择要运行的功能:
keepUnique - 选择要运行的部署:Head(默认值即可)
- 选择事件源:时间驱动
- 选择类型:日计时器
- 选择时间范围:选择你需要的凌晨时段,例如「凌晨1点到2点」
- 选择要运行的功能:
- 点击保存,按提示完成谷歌账号权限授权即可生效
内容的提问来源于stack exchange,提问作者Juan Portillo
相关产品推荐
相关产品推荐

