Google Apps Script每日备份表格重复生成多副本的解决方法
解决Google表格每日自动备份重复生成多份的问题
嗨,我来帮你搞定这个备份重复生成的问题~你遇到的情况大概率是重复创建了多个定时触发器,到了晚上7点的时候,每个触发器都跑一次备份,自然就生成一堆副本了。下面是具体的解决步骤和修改后的代码:
第一步:先清理现有重复的触发器
首先得把已经存在的重复触发器删掉,不然就算改了代码还是会重复执行:
- 打开你的Google表格,点击顶部菜单栏的「扩展程序」→「Apps脚本」
- 在脚本编辑器左侧,点击那个时钟形状的「触发器」图标
- 找到所有和这个备份脚本相关的触发器,全部删除干净
第二步:修改代码确保每天只触发一次
把你原来的代码替换成下面的版本,这个版本会自动避免重复创建触发器,同时保证每天只生成一份备份:
// 2018年4月18日 // 用于在指定目标文件夹中复制Google表格的Google Apps Script代码 function createDailyBackupTrigger() { // 先删除已有的备份触发器,彻底避免重复 deleteExistingBackupTriggers(); // 创建每天晚上7点触发的定时任务 ScriptApp.newTrigger('backupSpreadsheet') .timeBased() .everyDays(1) // 每天执行一次 .atHour(19) // 19点即晚上7点 .create(); } function deleteExistingBackupTriggers() { var allTriggers = ScriptApp.getProjectTriggers(); // 遍历所有触发器,删除和备份函数关联的 for (var i = 0; i < allTriggers.length; i++) { if (allTriggers[i].getHandlerFunction() === 'backupSpreadsheet') { ScriptApp.deleteTrigger(allTriggers[i]); } } } function backupSpreadsheet() { // 获取当前要备份的表格 var sourceSheet = SpreadsheetApp.getActiveSpreadsheet(); // 替换成你的目标文件夹ID(从云端硬盘文件夹URL里提取) var targetFolder = DriveApp.getFolderById("替换成你的目标文件夹ID"); // 生成带日期的备份文件名,方便区分且避免重名 var today = new Date(); var formattedDate = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy-MM-dd"); var backupFileName = sourceSheet.getName() + " 备份_" + formattedDate; // 创建一份副本到目标文件夹 sourceSheet.makeCopy(backupFileName, targetFolder); }
代码关键点说明:
createDailyBackupTrigger:每次创建新触发器前,会先删掉旧的同类型触发器,就算你不小心多次运行这个函数,也不会产生重复触发器backupSpreadsheet:这是实际执行备份的核心函数,里面没有循环逻辑,只会生成一份带当日日期的备份文件- 文件名加上日期,不仅方便你区分不同日期的备份,也能避免因文件名重复导致的意外问题
第三步:设置并验证触发器
- 把代码里的
"替换成你的目标文件夹ID"改成你实际的云端硬盘文件夹ID(打开目标文件夹,URL里的一串字符就是ID) - 在脚本编辑器里,选择
createDailyBackupTrigger函数,点击运行按钮(第一次运行需要授权,按照提示完成即可) - 回到触发器页面,确认只有一个触发器,对应的函数是
backupSpreadsheet,触发时间是每天19点
额外注意事项:
- 不要重复运行
createDailyBackupTrigger函数,如果需要修改触发时间,要么直接在触发器页面编辑,要么先运行deleteExistingBackupTriggers再重新创建 - 检查你原来的代码里有没有
RUNLOOP相关的循环逻辑,如果原来的代码里有循环调用备份的代码,一定要删掉,不然单次触发也会生成多个副本
内容的提问来源于stack exchange,提问作者Margaux Macaire
相关产品推荐
相关产品推荐

