Google Apps Script实现起止日期间每20天发邮件提醒,到期后仍发信问题求助
问题原因
你当前代码的核心问题有2个:
- 仅判断了20天间隔日期不等于结束日期,没有限制间隔日期不能晚于结束日期,导致超过结束日期的节点依然会触发发送
- 现有逻辑只能触发首次20天的提醒,无法实现每20天循环触发的需求,且用格式化字符串做日期对比容易出现格式不一致的匹配失败问题
修正后代码
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 endTimestamp = new Date(Utilities.formatDate(endDate, "ET", "yyyy/MM/dd")).getTime(); // 跳过起始日期晚于今日、结束日期早于今日的无效数据 if (startDate > today || endDate < today) continue; // 计算从起始日到今日,总共有多少个20天的间隔 var daysDiff = Math.floor((today - startDate) / (1000 * 60 * 60 * 24)); // 判断今日是不是刚好是20天的倍数节点 if (daysDiff % 20 !== 0) continue; // 额外判断当前节点是否早于等于结束日期 var currentNodeDate = new Date(startDate); currentNodeDate.setDate(startDate.getDate() + daysDiff); var currentNodeTimestamp = new Date(Utilities.formatDate(currentNodeDate, "ET", "yyyy/MM/dd")).getTime(); if (currentNodeTimestamp > endTimestamp) continue; // 格式化日期用于邮件内容 var formattedEndDate = Utilities.formatDate(endDate, "ET", "dd/MM/yyyy"); var formattedStartDate = Utilities.formatDate(startDate, "ET", "dd/MM/yyyy"); // 组装邮件内容 var message = ' Controllare documenti Progetto Formativo ' + '\n' + ' CODICE FISCALE: ' + row[0] + '\n' + ' NOME: ' + row[1] + '\n' + ' COGNOME: ' + row[2] + '\n' + ' DATA INIZIO: ' + formattedStartDate + '\n' + ' DATA FINE: ' + formattedEndDate; var subject = 'Progetto formativo' + row[0] + ' - ' + formattedEndDate; MailApp.sendEmail('mail@gmail.com', subject, message); } }
关键修改说明
- 新增结束日期边界判断:所有计算得到的20天节点晚于结束日期时,直接跳过发送
- 优化日期对比逻辑:统一转换为时间戳比较,避免不同格式的字符串匹配错误
- 新增多轮20天节点计算:自动计算从起始日到今日之间的所有20天倍数节点,实现每20天循环触发的效果
- 增加无效数据过滤:起始日未到、结束日已过的记录直接跳过,减少不必要的计算
后续配置
你只需要给这个脚本设置每日固定时间触发的触发器即可,脚本会自动判断当日是否需要发送提醒。
内容的提问来源于stack exchange,提问作者MONICA
相关产品推荐
相关产品推荐

