Google Sheets脚本优化:仅在状态单元格变更时移动行
问题分析与修正方案
原脚本的核心问题
- 状态判断语法错误:
else if分支里的r.getValue() == 'In Progress', 'Pending'使用了逗号运算符,这会让代码仅判定最后一个值'Pending',导致状态改为'In Progress'时无法触发移回操作。 - 未提前过滤非目标列操作:虽然原脚本包含列判断,但没有在最外层拦截非第3列的编辑,导致每次修改任意单元格都会执行一遍逻辑分支(只是条件不满足时不执行移动)。
修正后的脚本代码
function onEdit(event) { var editedRange = event.source.getActiveRange(); // 仅处理第3列(状态列)的编辑,其他列直接退出函数 if (editedRange.getColumn() !== 3) return; var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeSheet = editedRange.getSheet(); var statusValue = editedRange.getValue(); // 从「Current Tasks」移至「Archived Tasks」 if (activeSheet.getName() === "Current Tasks" && statusValue === 'Complete') { var targetSheet = ss.getSheetByName("Archived Tasks"); var targetRow = targetSheet.getLastRow() + 1; activeSheet.getRange(editedRange.getRow(), 1, 1, activeSheet.getLastColumn()) .moveTo(targetSheet.getRange(targetRow, 1)); activeSheet.deleteRow(editedRange.getRow()); } // 从「Archived Tasks」移回「Current Tasks」 else if (activeSheet.getName() === "Archived Tasks" && (statusValue === 'In Progress' || statusValue === 'Pending')) { var targetSheet = ss.getSheetByName("Current Tasks"); var targetRow = targetSheet.getLastRow() + 1; activeSheet.getRange(editedRange.getRow(), 1, 1, activeSheet.getLastColumn()) .moveTo(targetSheet.getRange(targetRow, 1)); activeSheet.deleteRow(editedRange.getRow()); } }
关键修改说明
- 提前拦截非目标列:开头先判断编辑单元格是否属于第3列,不是则直接退出,彻底避免非状态列编辑触发后续逻辑。
- 修复状态判断逻辑:用
||逻辑或同时匹配'In Progress'和'Pending',确保两种状态都能触发移回操作。 - 优化变量可读性:将变量名调整为
editedRange、activeSheet等更直观的命名,提升代码维护性。
内容的提问来源于stack exchange,提问作者G1U_9802
相关产品推荐
相关产品推荐

