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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:06:04