Apps Script配置为每月31日触发的时间触发器在30天月份能否正常运行
设置月触发器为31日时,无31日的月份能否正常触发
你编写的触发器代码
function timerTrigger() { ScriptApp.newTrigger('codeTrigger') .timeBased() .onMonthDay(31) .atHour(23) .inTimezone('Indian/Mauritius') .create() }
实际触发规则
这段代码创建的月触发器,会严格按照Google Apps Script的月日触发逻辑运行:
- 当月存在31日时,触发器会在设置的毛里求斯时区下,当月31日23:00准时触发
codeTrigger函数 - 当月不存在31日时(包括只有30天的4/6/9/11月、平年2月、闰年2月),该月的触发会被直接跳过,没有自动顺延到当月最后一天、补触发的机制
也就是说,仅靠这段31日的触发器,全年有近一半的月份完全不会执行目标函数。
适配月末天数差异的实现方案
Google Apps Script没有提供「每月最后一天」的原生触发器选项,要实现固定在每个月最后一天23点(毛里求斯时区)触发的需求,可以按如下逻辑调整:
- 分别创建28日、29日、30日、31日四个固定时间触发器,统一设置为23点、毛里求斯时区,全部指向同一个
codeTrigger函数 - 在
codeTrigger函数最开头增加判断逻辑:只有当前日期是当月最后一天时,才执行核心业务逻辑;如果不符合判断条件,直接退出函数
判断逻辑参考代码:
function codeTrigger() { const currentTime = new Date(); // 计算当月最后一天的日期数值 const lastDayNum = new Date(currentTime.getFullYear(), currentTime.getMonth() + 1, 0).getDate(); // 非当月最后一天直接退出 if (currentTime.getDate() !== lastDayNum) return; // 以下放置原本要执行的核心业务代码 }
这套逻辑可以100%覆盖所有月份的场景:
- 平年2月(28天):28日触发时即为当月最后一天,正常执行
- 闰年2月(29天):28日触发时不满足判断条件直接退出,29日触发时为当月最后一天,正常执行
- 30天的小月:28日、29日触发时不满足判断条件直接退出,30日触发时为当月最后一天正常执行,31日的触发因当月无对应日期直接跳过
- 31天的大月:28日、29日、30日触发时不满足判断条件直接退出,31日触发时为当月最后一天正常执行
内容的提问来源于stack exchange,提问作者P.J
相关产品推荐
相关产品推荐

