Google Apps Script工作表名称比对本应返回True却返回False
嘿,我来帮你看看这个问题~首先咱们先解决你最困惑的“相同字符串比对返回false”的核心问题,再梳理其他语法细节错误:
1. 核心问题:运算符优先级导致比对失效
你写的日志语句比如:
Logger.log("Comment Test: " + activeSheetName == "Comment Database");
在JavaScript里,+的优先级比==高,代码会先把"Comment Test: " + activeSheetName拼接成完整字符串,再和"Comment Database"做相等比较,结果自然是false。正确写法是把比较部分用括号包起来,让它先执行:
Logger.log("Comment Test: " + (activeSheetName == "Comment Database"));
这样就能得到预期的true结果了。
2. 其他语法/逻辑错误梳理
(1)方法调用遗漏括号
你写的:
var ThisColumn = activerange.getColumn Logger.log("active range col: " + activerange.getColumn + "active range row: " + activerange.getRow());
getColumn()和getRow()是方法,必须加括号才能获取对应值,不然打印的是函数本身的定义(就像日志里显示的function getColumn() {/* */})。修正后:
var ThisColumn = activerange.getColumn(); Logger.log("active range col: " + activerange.getColumn() + " active range row: " + activerange.getRow());
(2)变量名混淆
你定义了ValidRange来限定有效编辑范围,但判断时写错了变量:
if (ThisColumn < activerange.left || ThisColumn > activerange.right) return;
这里应该用ValidRange.left和ValidRange.right,而不是activerange(这是当前编辑的单元格区域),修正后:
if (ThisColumn < ValidRange.left || ThisColumn > ValidRange.right) return;
(3)变量未定义&方法名大小写错误
你在条件判断里用了未定义的range,而且GAS方法是驼峰命名:getformula()要写成getFormula(),SetFormula要改成setFormula()(而且是调用方法,不是赋值)。错误代码:
var FormulaToUse = range.offset(0, -1).getformula(); range.SetFormula = FormulaToUse;
修正后:
var FormulaToUse = activerange.offset(0, -1).getFormula(); activerange.setFormula(FormulaToUse);
(4)代码规范小细节
var activeSheetName = activeSheet.getName() 末尾补充分号,保持代码规范;日志里的active_range可以改成activerange.getA1Notation(),这样能看到具体单元格位置,更直观。
修正后的完整代码
function onEdit(e) { var activeSheet = e.source.getActiveSheet(); var activerange = e.range; var activeSheetName = activeSheet.getName(); // 补充分号 var ValidRange = { top : 3, bottom : 200, left: 4, right: 4 }; var ThisColumn = activerange.getColumn(); // 加括号调用方法 // 修正日志语句的运算符优先级问题,补全方法括号 Logger.log("active_range: " + activerange.getA1Notation()); Logger.log("active range col: " + activerange.getColumn() + " active range row: " + activerange.getRow()); Logger.log("active_range.value: " + activerange.getCell(1, 1).getValue()); Logger.log("active_range. colidx: " + activerange.getColumnIndex()); Logger.log("active sheet: " + activeSheetName); Logger.log("RWC Test: " + (activeSheetName == "RWC CR's")); Logger.log("STK Test: " + (activeSheetName == "STK CR's")); Logger.log("Comment Test: " + (activeSheetName == "Comment Database")); // 修正变量名,用ValidRange而不是activerange if (ThisColumn < ValidRange.left || ThisColumn > ValidRange.right) return; // 修正变量名和方法名 if (activeSheetName == "RWC CR's" || activeSheetName == "STK CR's" || activeSheetName == "BTWD CR's"){ var FormulaToUse = activerange.offset(0, -1).getFormula(); activerange.setFormula(FormulaToUse); } } function test_onEdit() { onEdit({ user : Session.getActiveUser().getEmail(), source : SpreadsheetApp.getActiveSpreadsheet(), range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(), value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(), authMode : "LIMITED" }); }
这样修改后,日志里的比对就能正确返回true,代码逻辑也能正常运行啦~
内容的提问来源于stack exchange,提问作者Selkie

