如何判断Google Sheets两工作表相同,onEdit中sheetId判断失效如何解决
问题原因及解决方案
- 第一个问题:运算符优先级错误导致日志输出不符合预期
JavaScript 中字符串拼接运算符+的优先级高于相等运算符==,你写的日志代码实际执行逻辑是:先拼接"Is spreadsheet1 :" + range.getSheet().getSheetId()得到完整字符串,再用这个字符串和spreadsheet1.getSheetId()做相等判断,结果自然永远是false,和实际的工作表ID是否一致无关。
正确的日志写法应该给相等判断部分加括号:
Logger.log("Is spreadsheet1 :" + (range.getSheet().getSheetId() == spreadsheet1.getSheetId())) Logger.log("Is spreadsheet2:" + (range.getSheet().getSheetId() == spreadsheet2.getSheetId()))
另外建议使用严格相等运算符===避免类型转换带来的意外问题。
- 第二个问题:日志打印代码笔误
你打印spreadsheet2的ID时,错误调用了spreadsheet1的getSheetId()方法:
// 错误写法 Logger.log("spreadsheet2: " + spreadsheet1.getSheetId().toString()) // 正确写法 Logger.log("spreadsheet2: " + spreadsheet2.getSheetId().toString())
这会导致你看到的spreadsheet2的ID日志是错误的,无法作为判断依据。
- 第三个问题:全局变量获取工作表的时机错误
你在全局作用域初始化spreadsheet1和spreadsheet2,Google Apps Script中每次触发onEdit函数时,全局作用域的代码都会重新执行一次,如果此时你没有提前定义ss为当前活跃表格,就会出现变量未定义错误,导致后续判断失效。
建议把工作表获取逻辑放到onEdit函数内部,写法更加稳妥:
function onEdit(e) { const ss = SpreadsheetApp.getActiveSpreadsheet() const spreadsheet1 = ss.getSheetByName("ONE") const spreadsheet2 = ss.getSheetByName("TWO") const range = e.range const currentSheetId = range.getSheet().getSheetId() if (currentSheetId === spreadsheet1.getSheetId() || currentSheetId === spreadsheet2.getSheetId()) { // 执行业务逻辑 } }
内容的提问来源于stack exchange,提问作者Lawrence
相关产品推荐
相关产品推荐

