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

Google Sheets Apps Script工作表判断逻辑错误致函数触发异常

Google Sheets三阶段校验脚本:工作表判断失效问题修复

问题场景

需在Google Sheets中实现三阶段校验,满足以下全部条件后调用对应函数:

  • 工作表名称为指定三个选项之一
  • 编辑的是目标列
  • 输入文本符合要求

目前第2、3项校验正常,但第1项失效:编辑「Stage 5」工作表时,会错误触发Stage 3的updateSt3Approval()函数。原代码如下:

function confirmUpdatedSheet(e){
  //Confirm field edited is Stage X Approval Status and confirm status matches action
    //required in function. If not then exit the function.

      if (((SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "Stage 3") || (SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "STAGE 3 update v1") || ((SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "STAGE 3 update v2")))
       && (e.range.columnStart === 20)
       && ((e.range.offset(0, 0).getDisplayValue() === "Approved") || (e.range.offset(0, 0).getDisplayValue() === "Approved with conditions"))) {
      updateSt3Approval();
       return;
      } else if (((SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "Stage 4") || (SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "STAGE 4 update v1") || ((SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "STAGE 4 update v2")))
       && (e.range.columnStart === 19)
       && ((e.range.offset(0, 0).getDisplayValue() === "Approved") || (e.range.offset(0, 0).getDisplayValue() === "Approved with conditions"))) {
      updateSt4Approval();
       return;
    } else if (((SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "Stage 5") || (SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "STAGE 5 update v1") || ((SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName() !== "STAGE 5 update v2")))
       && (e.range.columnStart === 20)
       && ((e.range.offset(0, 0).getDisplayValue() === "Approved") || (e.range.offset(0, 0).getDisplayValue() === "Approved with conditions"))) {
      updateSt5Approval();
       return;
    } else {
      return;
    }
}

错误原因

核心问题在于工作表名称的判断逻辑完全错误:
原代码中使用!==结合||判断,意味着只要工作表名称不是三个选项中的任意一个,条件就为true。但实际上,任何工作表名称都不可能同时等于三个选项,所以这个条件永远为true。比如编辑「Stage 5」时,它不等于「Stage 3」,第一个if的工作表条件就成立,再加上列和值符合要求,就会错误触发updateSt3Approval()。

此外,代码重复调用SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName(),冗余且影响性能。

修复后的代码

优化逻辑,先获取当前工作表名称,用数组存储每个阶段允许的工作表,再判断是否在数组内:

function confirmUpdatedSheet(e) {
  // 获取当前工作表名称
  const sheetName = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
  // 获取编辑单元格的显示值
  const cellValue = e.range.getDisplayValue();
  // 定义允许的审批状态
  const validStatuses = ["Approved", "Approved with conditions"];

  // 检查状态是否符合要求,不符合直接退出
  if (!validStatuses.includes(cellValue)) return;

  // Stage 3 校验
  const stage3Sheets = ["Stage 3", "STAGE 3 update v1", "STAGE 3 update v2"];
  if (stage3Sheets.includes(sheetName) && e.range.columnStart === 20) {
    updateSt3Approval();
    return;
  }

  // Stage 4 校验
  const stage4Sheets = ["Stage 4", "STAGE 4 update v1", "STAGE 4 update v2"];
  if (stage4Sheets.includes(sheetName) && e.range.columnStart === 19) {
    updateSt4Approval();
    return;
  }

  // Stage 5 校验
  const stage5Sheets = ["Stage 5", "STAGE 5 update v1", "STAGE 5 update v2"];
  if (stage5Sheets.includes(sheetName) && e.range.columnStart === 20) {
    updateSt5Approval();
    return;
  }
}

优化点说明

  1. 逻辑修正:用includes()判断工作表名称是否在允许列表内,直接明确校验条件
  2. 代码精简:提前获取工作表名称和单元格值,避免重复调用API
  3. 提前退出:先检查审批状态,不符合直接退出,减少后续判断
  4. 可读性提升:用数组存储每个阶段的允许工作表,逻辑清晰易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:15:57