Google Apps Script 自定义函数行复制移动及范围排序问题排查
问题1:封装后moveWhenDone()无法运行
原因:event事件对象、r(当前编辑单元格范围)是onEdit()函数的局部变量,你没有将这两个值传入自定义的moveWhenDone(),函数内部调用未定义变量直接触发报错,导致执行失败。
修复方案:修改函数定义,将需要的参数显式传入:
// 修改函数定义,接收所需的三个参数 function moveWhenDone(sourceSheet, activeRange, targetSheet) { var row = activeRange.getRow(); var numColumns = sourceSheet.getLastColumn(); var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); sourceSheet.getRange(row, 1, 1, numColumns).copyTo(target); sourceSheet.deleteRow(row); }
调用时对应传入参数即可:
// 原调用位置修改为 moveWhenDone(src, r, targetSheet);
问题2:sortSheets()仅单表生效
原因:原代码中的getRange("A2:Z")未指定工作表,默认仅对当前触发编辑的激活工作表生效,没有主动对两个工作表分别执行排序逻辑。
修复方案:修改sortSheets函数,分别获取两个工作表执行排序:
function sortSheets() { SpreadsheetApp.flush(); var ss = SpreadsheetApp.getActiveSpreadsheet(); // 分别获取两个工作表执行排序 var sheet1 = ss.getSheetByName("ASSIGMNMENTS"); var sheet2 = ss.getSheetByName("DONE"); // 按你设置的A:J筛选范围排序,避免不必要计算 sheet1.getRange("A2:J").sort([{column: 1, ascending: true}]); sheet2.getRange("A2:J").sort([{column: 1, ascending: true}]); }
修复后完整可运行代码
function onEdit(event) { var act = SpreadsheetApp.getActiveSpreadsheet(); var src = event.source.getActiveSheet(); var r = event.source.getActiveRange(); if(src.getName() == "ASSIGMNMENTS" && r.getColumn() == 7 && r.getValue() == "Done") { var targetSheet = act.getSheetByName("DONE"); moveWhenDone(src, r, targetSheet); } else if(src.getName() == "DONE" && r.getColumn() == 7 && r.getValue() != "Done") { var targetSheet = act.getSheetByName("ASSIGMNMENTS"); moveWhenDone(src, r, targetSheet); } sortSheets(); } function sortSheets() { SpreadsheetApp.flush(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet1 = ss.getSheetByName("ASSIGMNMENTS"); var sheet2 = ss.getSheetByName("DONE"); sheet1.getRange("A2:J").sort([{column: 1, ascending: true}]); sheet2.getRange("A2:J").sort([{column: 1, ascending: true}]); } function moveWhenDone(sourceSheet, activeRange, targetSheet) { var row = activeRange.getRow(); var numColumns = sourceSheet.getLastColumn(); var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); sourceSheet.getRange(row, 1, 1, numColumns).copyTo(target); sourceSheet.deleteRow(row); }
内容的提问来源于stack exchange,提问作者Fjott
相关产品推荐
相关产品推荐

