changeType为OTHER时如何获取谷歌表格变更对应的行号
问题根因
原代码始终返回行号1是存在两个核心逻辑错误:
- 硬编码获取固定范围
Y:Y,调用getRange("Y:Y")得到的是Y整列范围,对整列范围执行getRow()方法默认返回该范围的起始行号,也就是固定值1,和实际发生变更的位置没有任何关联。 - 没有利用onChange事件对象
e携带的有效上下文信息,完全没有定位实际变更范围的逻辑。
修正逻辑说明
参考你提供的可用代码逻辑,只要修改findRow函数的定位逻辑,同时保留changeType == "OTHER"的判断即可正常获取变更行号:
- 从事件对象
e.source拿到当前触发变更的表格实例 - 从表格实例获取当前激活的范围(也就是用户操作产生变更的范围)
- 从激活范围中获取行号即可
修正后完整代码
function notify(request) { MailApp.sendEmail("youremailhere.com", "行变更通知", request.editedRow.toString()); } function runNotify(e) { if (e.changeType == "OTHER") { var request = findRow(e); notify(request); } } function findRow(e) { var ss = e.source; var activeSheet = ss.getActiveSheet(); // 获取实际发生变更的激活范围 var changedRange = activeSheet.getActiveRange(); this.editedRow = changedRange.getRow(); return this; }
注意:
OTHER类型变更包含格式修改、行列增删、批注修改等多种非直接单元格内容编辑的操作,部分无焦点变更的操作(比如脚本后台修改)可能无法通过getActiveRange拿到正确行号,仅用户手动触发的OTHER类型变更可正常获取。
内容的提问来源于stack exchange,提问作者Shane Campbell
相关产品推荐
相关产品推荐

