Google App Script行移动异常:修改M Status时误移多行
问题根源
原脚本的核心问题是未限制触发操作的工作表:
- 当在
Singles工作表编辑行并执行删除后,工作表行号自动调整(原下一行变为原编辑行号),若onEdit事件因工作表变动被二次触发,脚本会直接对Singles工作表的原行号执行操作,导致误移下一行。 - 脚本未验证当前编辑的是否为目标工作表,任何工作表的第4列编辑操作都可能触发逻辑,引发意外行为。
修正后的脚本
function onEdit(e) { const range = e.range; const col = range.getColumn(); const row = range.getRow(); const val = range.getValue().trim(); const sourceSheet = e.source.getActiveSheet(); const ss = SpreadsheetApp.getActiveSpreadsheet(); // 仅在Singles工作表修改第4列为Married时执行移动 if (sourceSheet.getName() === 'Singles' && col === 4 && val === 'Married') { const targetSheet = ss.getSheetByName('Married'); const rowData = sourceSheet.getRange(row, 1, 1, sourceSheet.getLastColumn()).getValues()[0]; rowData[0] = ''; // 保留原逻辑清空第一列 targetSheet.appendRow(rowData); sourceSheet.deleteRow(row); } // 仅在Married工作表修改第4列为Single时执行移动 else if (sourceSheet.getName() === 'Married' && col === 4 && val === 'Single') { const targetSheet = ss.getSheetByName('Singles'); const rowData = sourceSheet.getRange(row, 1, 1, sourceSheet.getLastColumn()).getValues()[0]; rowData[0] = ''; targetSheet.appendRow(rowData); sourceSheet.deleteRow(row); } }
关键修正说明
- 新增工作表校验:通过
sourceSheet.getName()锁定操作仅在Singles或Married工作表内触发,彻底避免跨表或误触发的意外操作。 - 值处理优化:添加
trim()去除输入值的首尾空格,防止因输入空格导致的判断失效(比如Married会被误判为非Married)。 - 代码简化:统一获取Spreadsheet实例,减少重复调用,提升执行效率。
内容的提问来源于stack exchange,提问作者Poovarasan Rajenthran
相关产品推荐
相关产品推荐

