Google Script误触发邮件求助:A Total行连续值判断异常
问题排查与修复方案
核心问题分析
- 未限定检查范围为「当日新增列」:脚本遍历D到X所有列,只要存在任意一列的三行值都低于12000就触发告警,完全忽略了「每日新增」的要求,导致历史符合条件的列也会重复触发邮件。
- 缺乏告警去重机制:脚本没有记录已告警的列或状态,每次运行都会重复触发相同条件的告警。
- 告警信息不明确:邮件未说明具体是哪一列触发告警,不利于定位问题。
修复后的完整代码
function checkATotal() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("****"); var data = sheet.getDataRange().getValues(); var emailAddress = "***"; // 从下往上查找最新的"A Total"行,避免旧行干扰 var ATotalRow = -1; for (var row = data.length - 1; row >= 0; row--) { if (data[row][0] === "A Total") { ATotalRow = row; break; } } if (ATotalRow < 2) { // 确保至少有前两行可对比数据 return; } // 锁定需要检查的D-X列(对应索引3-23) var targetCols = []; for (var col = 3; col <= 23; col++) { targetCols.push(col); } // 读取已告警列记录,避免重复告警 var scriptProperties = PropertiesService.getScriptProperties(); var alertedCols = scriptProperties.getProperty("alertedCols") ? JSON.parse(scriptProperties.getProperty("alertedCols")) : []; var alertColumns = []; // 逐一检查目标列 for (var col of targetCols) { var currentVal = data[ATotalRow][col]; var prevVal1 = data[ATotalRow - 1][col]; var prevVal2 = data[ATotalRow - 2][col]; if (isNumeric(currentVal) && isNumeric(prevVal1) && isNumeric(prevVal2)) { var currNum = Number(currentVal); var prevNum1 = Number(prevVal1); var prevNum2 = Number(prevVal2); // 判断三值均低于12000且未告警过 if (currNum < 12000 && prevNum1 < 12000 && prevNum2 < 12000 && !alertedCols.includes(col)) { alertColumns.push(convertColIndexToLetter(col + 1)); // 转换为Excel列名 alertedCols.push(col); } } } // 有符合条件的列则发送告警邮件 if (alertColumns.length > 0) { var alertMessage = "以下列的连续三个'A Total'值均低于12000:\n" + alertColumns.join(", "); sendEmail(emailAddress, "Alert from A Total", alertMessage); // 更新已告警记录 scriptProperties.setProperty("alertedCols", JSON.stringify(alertedCols)); } } function sendEmail(recipient, subject, message) { MailApp.sendEmail(recipient, subject, message); } function isNumeric(value) { return !isNaN(parseFloat(value)) && isFinite(value); } // 辅助函数:将列索引转换为Excel列名(如3→D) function convertColIndexToLetter(index) { var letter = ''; while (index > 0) { var remainder = (index - 1) % 26; letter = String.fromCharCode(65 + remainder) + letter; index = Math.floor((index - 1) / 26); } return letter; }
关键修改点说明
- 定位最新目标行:从表格底部往上查找"A Total"行,确保获取的是当日新增的目标数据行。
- 新增去重机制:通过
PropertiesService存储已告警的列索引,同一列不会重复触发告警。 - 明确告警内容:邮件中列出具体触发告警的列名,方便快速定位问题。
- 保留核心逻辑:严格检查D-X列的连续三行值,符合「新增值及前两个值均低于12000」的需求。
内容的提问来源于stack exchange,提问作者Amanda Cooper
相关产品推荐
相关产品推荐

