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

如何创建每日触发但排除周日的触发器(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:17:05