谷歌表格日期监控脚本故障:状态列着色与服务日期确认异常
问题分析
- 状态列着色逻辑错误:原代码通过
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
相关产品推荐
相关产品推荐

