如何创建每日触发但排除周日的触发器(Trigger)
问题:创建每周除周日外每日触发的触发器
我希望创建一个每周除周日外每日触发的触发器。我尝试了如下代码,虽能运行,但发现周日仍有执行记录,无法确认其是否符合预期需求,恳请各位指导我如何验证,并推荐其他可行的实现代码。
尝试的代码
function setTriggerNoSunday() { var today = new Date(); // 获取当前日期和时间 // 设置触发器在今日指定时间执行 var triggerDate = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 14, 25); // 检查触发日期是否为周日(0代表周日),若是则延后一天 if (triggerDate.getDay() === 0) { triggerDate.setDate(triggerDate.getDate() + 1); } // 使用计算后的触发日期创建触发器 ScriptApp.newTrigger('heyTrigger') .timeBased() .at(triggerDate) .create(); }
可正常运行的关联代码
function heyTrigger() { var startTime = new Date(); startTime.setHours(17); // 设置触发开始时间 startTime.setMinutes(30); // 默认设置为10:30(注释原文有误,按代码保留) startTime.setSeconds(0); var endTime = new Date(); endTime.setHours(22); // 设置触发结束时间 endTime.setMinutes(0); // 默认设置为22:00(需使用24小时制以保证触发器正常工作) endTime.setSeconds(0); // 额外预留30分钟以获取次日时间 var intervalMinutes = 30; // 设置触发间隔为30分钟 var currentTime = new Date(); var nextRunTime = new Date(); nextRunTime.setTime(Math.ceil(currentTime.getTime() / (intervalMinutes * 60 * 1000)) * (intervalMinutes * 60 * 1000)); if (nextRunTime < startTime) { nextRunTime = startTime; } while (nextRunTime <= endTime) { ScriptApp.newTrigger('dioSamaDIO') .timeBased() .at(nextRunTime) .create(); nextRunTime.setTime(nextRunTime.getTime() + (intervalMinutes * 60 * 1000)); } } function dioSamaDIO() { var app = SpreadsheetApp; var clearSheet = app.getActiveSpreadsheet().getSheetByName("TEST#"); var numRows = 3; // 起始行数 var numCols = 3; // 列数 var rangeA2 = clearSheet.getRange("A2"); var rangeA3 = clearSheet.getRange("A3"); var dateA2 = rangeA2.getValue(); var dateA3 = rangeA3.getValue(); // 比较A2和A3单元格中的日期 if (dateA3 > dateA2) { rangeA2.clearContent(); rangeA2.setValue(dateA3); // 将A3的数据移至A2 } else if (dateA2 > dateA3) { rangeA3.clearContent(); } // 删除B3、B4、B5等行 for (numRows = 3; numRows <= clearSheet.getLastRow(); numRows++) { clearSheet.deleteRow(numRows); if (numRows >= 3) { // 删除1行后终止循环 break; } } }
验证方法
1. 手动修改时间测试
临时将本地系统时间改为周日,运行setTriggerNoSunday函数,然后在Google Apps Script的触发器页面查看创建的触发器执行时间,确认是否为周一14:25。
2. 检查触发器列表
直接进入Google Apps Script界面的「触发器」选项卡,查看所有已创建的触发器的执行计划,确认周日无对应的触发任务。
3. 添加日志记录
在dioSamaDIO函数开头添加日志代码,记录每次触发的时间,后续通过「查看」→「日志」确认周日是否有执行记录:
function dioSamaDIO() { console.log("触发时间:" + new Date()); // 原函数内容... }
推荐的实现代码
你当前的代码是创建单次触发器,需要每日调用才能生成当日的触发任务,容易出现冗余或遗漏。推荐直接创建每周重复触发器,一次性配置好周一至周六的触发规则,从根源上避免周日执行:
// 创建每周一至周六14:25触发的重复触发器 function createWeeklyTrigger() { // 配置触发时间 const triggerHour = 14; const triggerMinute = 25; // 创建重复触发器,指定每周一至周六执行 ScriptApp.newTrigger('dioSamaDIO') .timeBased() .atHour(triggerHour) .nearMinute(triggerMinute) .everyWeeks(1) .onWeekDays([ ScriptApp.WeekDay.MONDAY, ScriptApp.WeekDay.TUESDAY, ScriptApp.WeekDay.WEDNESDAY, ScriptApp.WeekDay.THURSDAY, ScriptApp.WeekDay.FRIDAY, ScriptApp.WeekDay.SATURDAY ]) .create(); }
代码优势
- 只需运行一次,即可自动每周重复触发,无需每日创建单次触发器
- 直接通过
onWeekDays指定允许触发的工作日,彻底排除周日 - 配置更简洁,减少冗余代码和出错概率
内容的提问来源于stack exchange,提问作者546 546
相关产品推荐
相关产品推荐

