关于Google Sheets onEdit触发时e.range.getRow()返回值差异的确认问询
问题分析:onEdit触发器中e.range行号差异的原因
这是Google Sheets的预期行为,和代码本身无关,是编辑器的事件触发逻辑导致的,具体原因如下:
两种场景的触发逻辑差异
场景1:输入K8后直接点击I7复选框
当你在K8输入内容后,单元格仍处于编辑状态,此时直接点击I7的复选框,Google Sheets会优先触发K8单元格的编辑结束事件——因为系统需要先确认你完成了当前单元格的编辑操作,再处理下一个点击动作。所以此时onEdit捕获的是K8单元格的修改事件,e.range.getRow()自然返回8。场景2:输入K8后点击其他单元格再点I7
点击其他单元格时,K8的编辑状态已经结束,系统已经触发过K8的编辑事件。此时再点击I7复选框,触发的就是I7单元格的复选框修改事件,所以e.range.getRow()返回7。
你的代码存在的额外问题
虽然行号差异是预期行为,但你的最小复现代码里有一个逻辑bug:switch语句的case 9没有加break,会导致代码执行完case 9的逻辑后,自动fall through到case 11,比如用户点击I7复选框时,会在执行完“获取行数并提示”的逻辑后,又去设置D7的提示文本,这不符合你的设计预期。
修复后的代码示例:
function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var eventRow = e.range.getRow(); var eventColumn = e.range.getColumn(); e.source.toast(`Event row is ${eventRow} and event column is ${eventColumn}`); if (eventRow == 7) { switch (eventColumn) { case 9: if (sheet.getRange(7,11).getValue()) { var rowsToAdd = sheet.getRange('K8').getValue(); e.source.toast(`I will add ${rowsToAdd} rows`); } break; // 加上break避免fall through到case11 case 11: var infoMessage = "Please enter the number of rows to be added in the cell underneath, and click the checkbox to action"; sheet.getRange('D7').setValue(infoMessage); return; } } }
内容的提问来源于stack exchange,提问作者Stuart L
相关产品推荐
相关产品推荐

