You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:18:03