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

Google Script误触发邮件求助:A Total行连续值判断异常

问题排查与修复方案

核心问题分析

  1. 未限定检查范围为「当日新增列」:脚本遍历D到X所有列,只要存在任意一列的三行值都低于12000就触发告警,完全忽略了「每日新增」的要求,导致历史符合条件的列也会重复触发邮件。
  2. 缺乏告警去重机制:脚本没有记录已告警的列或状态,每次运行都会重复触发相同条件的告警。
  3. 告警信息不明确:邮件未说明具体是哪一列触发告警,不利于定位问题。

修复后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:23:30