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

Apps Script Slack过期日期通知异常:已过期日期仍触发通知

问题分析与修复方案

问题根源

  1. 绝对值引发误判:你用Math.abs()计算日期时间差,会把过期后的天数差强制转为正数。比如过期日期是20/12/2022、当前日期是22/12/2022时,两者的时间差绝对值为2天,days_left等于2,刚好命中days_left == 2的判断条件,导致错误发送“即将过期”的通知。
  2. 缺少过期状态区分:代码未判断过期日期在当前日期的前后,无法区分“即将过期”和“已过期”两种场景。

修复代码

修改getReminderText函数中的日期差计算与判断逻辑:

const getReminderText = () => {
  var sheet = SpreadsheetApp.getActive().getSheetByName('domains');
  var startRow = 2;
  var numRows = sheet.getLastRow() - 1;
  var numColumns = sheet.getLastColumn();
  var dataRange = sheet.getRange(startRow, 1, numRows, numColumns);
  var data = dataRange.getValues();
  let sendMessageText = "";
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var today = new Date(), // today's date
    exp_date = row[4] // exp date

    var cert_details = 
        {
          company_name:row[0],
          cert_company_name:row[1],
          cert_company_email:row[4]
        };

    var t2 = new Date(exp_date);
    t2.setHours(0,0,0,0);
    var t1 = new Date(today);
    t1.setHours(0,0,0,0);

    // 去掉Math.abs,保留正负值区分过期状态
    var difference_ms = t2.getTime() - t1.getTime();
    var days_left = Math.round(difference_ms/(24*3600*1000));
    
    cert_details.days_left = days_left;
    
    // 仅在未过期且剩余天数为2时触发通知
    if (days_left == 2 && difference_ms > 0) {
      sendMessageText += `\n${cert_details.company_name} will expire in *2 days*`;
    }
 }

  return sendMessageText || "";
}

额外优化建议

  • 若需确保时区正确,可在创建日期对象时指定罗马时区:new Date(exp_date.toLocaleString('en-US', {timeZone: 'Europe/Rome'})),避免因时区差异导致的日期解析错误。
  • 可添加过期后的提醒逻辑,比如当days_left < 0时,发送“已过期${Math.abs(days_left)}天”的通知。

内容的提问来源于stack exchange,提问作者Gavis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:02:48