Apps Script Slack过期日期通知异常:已过期日期仍触发通知
问题分析与修复方案
问题根源
- 绝对值引发误判:你用
Math.abs()计算日期时间差,会把过期后的天数差强制转为正数。比如过期日期是20/12/2022、当前日期是22/12/2022时,两者的时间差绝对值为2天,days_left等于2,刚好命中days_left == 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
相关产品推荐
相关产品推荐

