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

Google Sheets脚本问题:如何避免备份表随源表删除行同步删除?

解决Google Sheets备份脚本同步删除的问题

嘿,这个问题其实很好解决——核心就是让备份表只做追加新增行的操作,完全忽略源表的删除行为。你的原脚本应该是采用了「同步全表」或者监听了删除事件的逻辑,才会导致源表删行时备份表也跟着删。下面是具体的修改方案:

核心思路

放弃任何会同步删除的逻辑,只记录并复制源表中新增的行:

  • 用脚本属性存储每个源表最后一次复制的行号,每次运行时只复制比这个行号晚出现的新行
  • 完全不处理源表的删除操作,备份表只做追加,永远保留历史数据

修改后的脚本代码

替换你原来的Copy函数为下面的代码:

function copyNewRowsOnly() {
  // 替换成你的Google Sheets文档ID
  const targetSpreadsheet = SpreadsheetApp.openById('17ekZcvPQYrcX1ny-RtPQczEfbmd1JZUkRVx6N7qTtCA');
  
  // 定义源表和对应备份表的配对关系
  const sheetMappings = [
    { sourceName: 'MEL Micro Set Up', backupName: 'Backup Set Up' },
    { sourceName: 'MEL Micro Confirmation', backupName: 'Backup Confirmation' }
  ];
  
  // 用脚本属性持久化记录每个源表最后复制的行号
  const scriptProperties = PropertiesService.getScriptProperties();
  
  sheetMappings.forEach(mapping => {
    const sourceSheet = targetSpreadsheet.getSheetByName(mapping.sourceName);
    const backupSheet = targetSpreadsheet.getSheetByName(mapping.backupName);
    
    // 检查工作表是否存在,避免报错
    if (!sourceSheet || !backupSheet) {
      console.log(`警告:找不到工作表 "${mapping.sourceName}" 或 "${mapping.backupName}"`);
      return;
    }
    
    // 获取源表所有数据(假设第一行是表头,数据从第二行开始)
    const allSourceRows = sourceSheet.getDataRange().getValues();
    // 获取上次复制到的行号,默认是1(表头行)
    const lastCopiedRow = Number(scriptProperties.getProperty(`lastCopied_${mapping.sourceName}`)) || 1;
    
    // 如果源表有新行(总行数大于上次复制的行号)
    if (allSourceRows.length > lastCopiedRow) {
      // 截取新增的行(从上次复制行号的下一行到最后一行)
      const newRowsToCopy = allSourceRows.slice(lastCopiedRow);
      // 将新行追加到备份表的末尾
      backupSheet.getRange(backupSheet.getLastRow() + 1, 1, newRowsToCopy.length, newRowsToCopy[0].length)
                 .setValues(newRowsToCopy);
      // 更新记录的最后复制行号为源表当前总行数
      scriptProperties.setProperty(`lastCopied_${mapping.sourceName}`, allSourceRows.length.toString());
    }
  });
}

触发器设置(关键)

根据你原来的触发方式调整:

  • 定时触发:如果是定时运行脚本(比如每小时同步一次),直接把触发器绑定到新的copyNewRowsOnly函数即可。
  • 事件触发:如果是依赖工作表变更触发,需要修改触发器逻辑,只响应新增行事件,忽略删除操作:
    function onSheetChange(e) {
      // 仅当有新行插入时才执行备份
      if (e.changeType === 'INSERT_ROW') {
        copyNewRowsOnly();
      }
    }
    
    然后在脚本编辑器的「编辑」→「当前项目的触发器」中,创建一个onSheetChange的「 onChange 」触发器。

额外注意事项

  1. 第一次运行脚本时,会把源表中所有未备份的行(从第二行开始)全部复制到备份表,如果不需要初始同步,可以手动修改lastCopiedRow的默认值(比如改成源表当前的总行数)。
  2. 确保源表和备份表的表头结构完全一致,避免数据错位。
  3. 一定要删除原来脚本中任何监听「删除行」事件或者同步删除备份行的代码,彻底切断删除同步的逻辑。

内容的提问来源于stack exchange,提问作者Margaux Macaire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:39:56