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

谷歌表格日期监控脚本故障:状态列着色与服务日期确认异常

问题分析
  • 状态列着色逻辑错误:原代码通过setValue("Red")/setValue("White")设置单元格文本内容,而非背景颜色,与需求不符。
  • 日期间隔计算不精确:使用固定30.44天换算月数会产生误差,无法准确判断“恰好4个月”的条件。
  • 服务日期判断失效:空单元格转换为Date对象后是无效日期,直接与空字符串比较无法正确识别已填写的服务日期。
  • 重复触发问题:原脚本每次运行都会重复发送邮件、修改状态,未做重复判断。
  • 需求匹配偏差:原代码逻辑为“间隔≥4个月且当前日期≥下次服务日期”时触发,与需求中“间隔恰好4个月”的要求不符。
修复后的完整代码
function manageServiceStatusAndNotifications() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var today = new Date();
  // 标准化日期,清除时分秒避免干扰判断
  today.setHours(0, 0, 0, 0);

  for (var i = 1; i < data.length; i++) {
    var rowNum = i + 1;
    var installationDate = new Date(data[i][3]);
    var nextServiceDate = new Date(data[i][4]);
    var dateOfService = new Date(data[i][5]);
    var statusCell = sheet.getRange(rowNum, 7);
    var currentStatusColor = statusCell.getBackground();

    // 标准化所有日期,统一清除时分秒
    installationDate.setHours(0, 0, 0, 0);
    nextServiceDate.setHours(0, 0, 0, 0);
    if (!isNaN(dateOfService)) {
      dateOfService.setHours(0, 0, 0, 0);
    }

    // 计算准确的月间隔:(年份差×12) + 月份差
    var monthDifference = (nextServiceDate.getFullYear() - installationDate.getFullYear()) * 12 + 
                          (nextServiceDate.getMonth() - installationDate.getMonth());

    // 场景1:安装与下次服务间隔恰好4个月,且未填写服务日期,设置红色提醒并发送通知
    if (monthDifference === 4 && isNaN(dateOfService) && currentStatusColor !== "#ff0000") {
      statusCell.setBackground("#ff0000");
      
      var clientName = data[i][0];
      var location = data[i][1];
      var systemInstalled = data[i][2];
      
      var message = `Greetings,

It's time for the next service for ${clientName} at ${location}. The system installed is ${systemInstalled}.

Regards,
Benazir Mirza,
Project Manager`;
      
      var recipient = 'chibonitimothy@gmail.com';
      var subject = 'Service Due Notification';
      
      MailApp.sendEmail(recipient, subject, message);
    }

    // 场景2:服务日期已填写,恢复白色状态并发送完成确认邮件
    if (!isNaN(dateOfService) && currentStatusColor !== "#ffffff") {
      statusCell.setBackground("#ffffff");
      
      var clientName = data[i][0];
      var message = `Greetings,

The service for ${clientName} has been completed on ${dateOfService.toLocaleDateString()}.

Regards,
Benazir Mirza,
Project Manager`;
      
      var recipient = 'chibonitimothy@gmail.com';
      var subject = 'Service Completed Confirmation';
      
      MailApp.sendEmail(recipient, subject, message);
    }
  }
}
关键修复说明
  • 状态着色修正:用setBackground()替代setValue(),直接设置单元格背景色(红色#ff0000、白色#ffffff),符合视觉提醒需求。
  • 精确月间隔计算:通过日期对象的年、月属性计算间隔,彻底避免固定天数换算的误差,准确判断“恰好4个月”的条件。
  • 服务日期有效性判断:使用!isNaN(dateOfService)识别有效日期,解决空单元格或无效日期的判断问题。
  • 避免重复操作:增加当前状态颜色判断,仅当状态未达到目标时执行着色和邮件发送,防止重复触发。
  • 需求逻辑对齐:调整触发条件为“间隔恰好4个月且未填写服务日期”时触发提醒;服务日期填写后自动恢复状态并发送确认邮件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:23:25