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; } }
优化点说明
- 逻辑修正:用
includes()判断工作表名称是否在允许列表内,直接明确校验条件 - 代码精简:提前获取工作表名称和单元格值,避免重复调用API
- 提前退出:先检查审批状态,不符合直接退出,减少后续判断
- 可读性提升:用数组存储每个阶段的允许工作表,逻辑清晰易维护
内容的提问来源于stack exchange,提问作者Teens
相关产品推荐
相关产品推荐

