如何检测Google Sheets触发器上次执行是否失败并自动重试?
Google Sheets 定时任务失败重试方案
核心思路
通过在原任务中记录执行状态,搭配定时检测脚本读取状态并触发重试,解决网络或站点繁忙导致的执行失败/超时问题。
具体实现步骤
1. 新增状态记录工作表
在你的Google Sheets里新建一张名为ExecutionLog的工作表,表头设为:执行时间、状态(成功/失败/超时)、重试次数。
2. 修改原任务代码,加入状态记录
在原代码的首尾和异常捕获部分添加日志写入逻辑:
function originalTask() { const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ExecutionLog'); const now = new Date(); let status = "成功"; let retryCount = 0; try { // 原有的任务代码(比如批量API调用等逻辑) // ... // 执行成功后写入日志 logSheet.appendRow([now, status, retryCount]); } catch (e) { // 判断异常类型 if (e.message.includes("Timeout") || e.message.includes("超时")) { status = "超时"; } else { status = "失败"; } // 写入失败/超时日志 logSheet.appendRow([now, status, retryCount]); throw e; // 保留异常,不影响触发器的错误追踪 } }
3. 编写检测重试脚本
创建新函数,检查最近一次任务状态,满足条件则触发重试:
function checkAndRetry() { const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ExecutionLog'); const lastRow = logSheet.getLastRow(); if (lastRow < 2) return; // 无日志记录直接返回 const lastLog = logSheet.getRange(lastRow, 1, 1, 3).getValues()[0]; const lastStatus = lastLog[1]; const lastRetryCount = lastLog[2]; const maxRetryTimes = 3; // 限制最大重试次数,避免无限循环 // 符合重试条件则执行 if ((lastStatus === "失败" || lastStatus === "超时") && lastRetryCount < maxRetryTimes) { try { originalTask(); // 重试成功后更新日志状态和重试次数 logSheet.getRange(lastRow, 2).setValue("成功"); logSheet.getRange(lastRow, 3).setValue(lastRetryCount + 1); } catch (e) { // 重试失败,仅更新重试次数 logSheet.getRange(lastRow, 3).setValue(lastRetryCount + 1); } } }
4. 设置检测触发器
打开脚本编辑器,点击「编辑」→「当前项目的触发器」,新增触发器:
- 选择函数:
checkAndRetry - 事件源:
时间驱动 - 类型:
分钟计时器 - 间隔:
每15分钟
注意事项
- 配额限制:Google Apps Script有每日运行时间配额,需控制重试次数,避免触发配额预警。
- 日志清理:定期清理
ExecutionLog的旧记录,防止工作表过大影响性能。 - 异常扩展:可根据实际API返回的错误类型,细化
status的判断逻辑。
内容的提问来源于stack exchange,提问作者Michael Liew
相关产品推荐
相关产品推荐

