Google Sheets onEdit函数插入行数多于编码设定值问题排查
问题触发原因
核心原因是onEdit编辑触发器被递归触发:onEdit会响应所有表格编辑行为,包括你代码内部调用setValue产生的编辑动作:
- 第一次触发:你手动输入
EVERY/PARTY触发脚本,执行第一次插入6行的逻辑 - 第二次触发:代码给下移2行的新单元格写入
EVERY/PARTY时,再次触发onEdit,又匹配到判断条件,第二次插入6行,两次累计就插入了12行
另外你的代码存在小语法问题:变量声明部分c2后缺少逗号,会导致变量作用域异常。
解决方案
在执行脚本内部的编辑操作前,加一个执行锁防止递归触发即可,修改后代码如下:
function onEdit(e) { // 防止递归触发的锁:如果当前已有脚本在执行编辑逻辑,直接退出 const scriptProps = PropertiesService.getScriptProperties(); if (scriptProps.getProperty('isEditing') === 'true') return; try { // 上锁 scriptProps.setProperty('isEditing', 'true'); let c = e.range, cellrow = c.getRowIndex(), cellcol = c.getColumnIndex(), c2, sheet = SpreadsheetApp.getActiveSheet(); /* code to part sea of words in spreadsheet */ let cvalue = c.getValue(); if (cvalue == "EVERY" || cvalue == "PARTY") { let [upper, left, right, lower] = checkNeighbours(c); let neighbours = [upper, left, right, lower] if (!allBlank(neighbours)) { // insert 6 rows and delete original word at original position c.getSheet().insertRowsAfter(c.getRowIndex(), 6); c.setValue(""); // paste original word in cell 2 rows below original position cellrow += 2; c2 = sheet.getRange(cellrow, cellcol); c2.setValue(cvalue); } } } finally { // 无论执行成功失败都解锁,避免后续操作被拦截 scriptProps.deleteProperty('isEditing'); } } // return the (up to) 8 cells surrounding cell c function checkNeighbours(c) { let nbUpperRow = c.offset(-1, -2, 1, 8), nbLeft = c.offset(0, -2, 1, 2), nbRight = c.offset(0, 1, 1, 5), nbLowerRow = c.offset(1, -2, 3, 8); return [nbUpperRow, nbLeft, nbRight, nbLowerRow]; } // are all the cells given, blank? function allBlank(rs) { for (var c of rs) { if (!c.isBlank()) return false; } return true; }
内容的提问来源于stack exchange,提问作者maxloo
相关产品推荐
相关产品推荐

