Google Sheets AppScript:每日检测条件但每周仅发一次告警邮件
实现每日检测+每周仅发一次告警邮件的方案
这个需求完全可行,核心思路是记录上次发送告警的时间,通过判断时间间隔来控制邮件发送频率,同时保留每日检测的逻辑。下面是具体实现方案:
实现步骤
- 用
PropertiesService存储上次发送邮件的日期(脚本级持久化存储,不会随脚本运行结束丢失) - 每日触发脚本时,先判断单元格条件是否满足
- 若条件满足,检查距离上次发送是否已过7天,是则发送邮件并更新发送时间
- 若条件不满足,重置存储的发送时间(确保下次条件满足时重新计时)
修改后的完整代码
function CheckSessions() { // 获取目标工作表 const ss = SpreadsheetApp.getActiveSpreadsheet(); const billingSheet = ss.getSheetByName("Billing"); // 获取单元格值和邮箱地址 const sessions = billingSheet.getRange("K1").getValue(); const emailAddress = billingSheet.getRange("H2").getValue(); // 获取脚本属性存储(用来记录上次发送时间) const scriptProps = PropertiesService.getScriptProperties(); const lastSentDateStr = scriptProps.getProperty("lastAlertSentDate"); const today = new Date(); // 条件判断:单元格值满足,且满足发送间隔(或从未发送过) if (sessions === 1) { let shouldSend = false; if (!lastSentDateStr) { // 从未发送过,直接发送 shouldSend = true; } else { // 计算上次发送至今的天数 const lastSentDate = new Date(lastSentDateStr); const daysDiff = Math.floor((today - lastSentDate) / (1000 * 60 * 60 * 24)); // 间隔超过7天则发送 if (daysDiff >= 7) { shouldSend = true; } } if (shouldSend) { // 发送告警邮件 const message = 'This is your Alert email!'; const subject = 'Your Google Spreadsheet Alert'; MailApp.sendEmail(emailAddress, subject, message); // 更新上次发送日期为今天 scriptProps.setProperty("lastAlertSentDate", today.toISOString()); } } else { // 条件不满足时,重置发送记录,确保下次条件满足时重新计时 scriptProps.deleteProperty("lastAlertSentDate"); } }
关键逻辑说明
- 持久化存储:
PropertiesService.getScriptProperties()用来保存上次发送邮件的日期,即使脚本重启或触发器多次运行,数据也不会丢失 - 时间间隔计算:通过计算当前日期与上次发送日期的毫秒差,转换为天数,判断是否达到7天的发送间隔
- 重置逻辑:当单元格条件不再满足时,删除存储的发送记录,这样下次条件满足时会重新开始计算7天间隔,避免出现条件恢复后仍需要等待剩余天数的问题
触发器设置
将脚本设置为每日触发(比如每天固定时间运行一次),无需保留原有的每周触发器。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

