Google Apps Script实现每20天发邮件提醒至结束日期的问题求助
问题原因
你的代码存在3个核心问题导致无法实现每隔20天触发提醒:
- 你注释了循环计算多轮20天间隔的逻辑,且
j变量未声明定义,调用时自然返回undefined - 直接修改了原始起始日期对象
date,会导致后续累加计算的基准日期错误 - 直接对比日期格式化后的字符串,容易因为格式、时区偏差出现判断错误,优先用时间戳数值对比更稳妥
修正后代码
function emailAlert() { var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); var lastCol = sheet.getLastColumn(); var dataRange = sheet.getRange( 2, 1, lastRow-1, lastCol); var data = dataRange.getValues(); // 统一格式化今天的日期转成时间戳,避免重复计算 var today = new Date(); var todayTimestamp = new Date(Utilities.formatDate(today, "ET", "yyyy/MM/dd")).getTime(); for (var i = 0; i < data.length; ++i) { var row = data[i]; var startDate = new Date(row[3]); var endDate = new Date(row[4]); // 起止日期统一转成当天零点的时间戳,避免时间部分影响判断 var startTimestamp = new Date(Utilities.formatDate(startDate, "ET", "yyyy/MM/dd")).getTime(); var endTimestamp = new Date(Utilities.formatDate(endDate, "ET", "yyyy/MM/dd")).getTime(); var endDateFormat = Utilities.formatDate(endDate, "ET", "dd/MM/yyyy"); // 每隔20天循环计算一次,直到超过结束日期就停止 for (var j = 20; ; j += 20) { // 用原始起始日期计算第j天的时间戳,不修改原始变量 var checkTimestamp = startTimestamp + j * 24 * 60 * 60 * 1000; // 超过结束日期直接终止当前循环 if (checkTimestamp > endTimestamp) { break; } // 匹配到今日就发邮件 if (checkTimestamp === todayTimestamp) { var subject = 'Progetto formativo' + row[0] + ' - ' + endDateFormat; var message = ' Controllare documenti Progetto Formativo ' + '\n' + ' CODICE FISCALE: ' + row[0] + '\n' + ' NOME: ' + row[1] + '\n' + ' COGNOME: ' + row[2] + '\n' + ' DATA INIZIO: ' + Utilities.formatDate(startDate, "ET", "dd/MM/yyyy") + '\n' + ' DATA FINE: ' + endDateFormat; MailApp.sendEmail('email@gmail.com', subject, message); // 同一行数据当天仅发一次,触发后直接跳出当前循环 break; } } } }
额外配置提醒
代码调试完成后,需要在Google Apps Script后台添加时间驱动触发器,设置为每天固定时间运行一次emailAlert函数,才能保证每天自动检查是否需要发送提醒。
内容的提问来源于stack exchange,提问作者Suhas Yadav
相关产品推荐
相关产品推荐

