当我合并 2 个 onEdit 脚本时,我不断在 Google sheets-Script Editor 上收到范围错误

When I combine 2 onEdit scripts, I keep getting a range error on Google sheets-Script Editor

我有一个共享的 google sheet 用作待办事项列表。我正在使用脚本编辑器。我最初将所有内容移至 sheet 1 上的空行。随着添加更多内容,我发现已完成的项目需要移至第二个 sheet。 我的原始代码从第 6/F 列中的任何输入移动了该行。我尝试添加一个触发器以将第 7/G 列移动到 sheet 2。这两个代码都可以单独使用,但我似乎无法将它们组合起来。

在研究了这个站点和其他站点之后,我尝试重命名 onEdit、嵌套、使用“我的函数”、录制宏。 我收到同样的错误,但该行会根据我编辑代码的方式而改变。 “TypeError:无法读取未定义的 onEdit @ Done.gs:2 的 属性 'range'”

我想达到的目标,

当任务标记为完成时,它会移动到 sheet2(第 7 列/G 类型“是”) 当更新任务的状态时,它会将其移动到 sheet 1 上的空行(使用的第 6/F 列字词 – 进行中、待审、稍后) 我也在寻找一门基础课程来开始理解 google sheet 的脚本和宏。我意识到我是从中间开始,让自己变得更难。谢谢,感谢您的反馈和建议!

function onEdit(event) {
// assumes source data in sheet named Sheet1
// target sheet of move to named Sheet2
// test column with yes is col 7 or G
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();

if(s.getName() == "Sheet1" && r.getColumn() == 7 && r.getValue() == "yes") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sheet2");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
function onEdit(e) {

const row = e.range.getRow();
const col = e.range.getColumn();
const as = e.source.getActiveSheet();
if(as.getName() == "Sheet1" && col == 6  && row > 1 && !as.getRange(row,col).getValue()=='') {  
const row_new = as.getRange(row,1,1,col);
row_new.copyTo(as.getRange(as.getLastRow()+1,1,1,col));
as.deleteRow(row);

 }
}

试试这个:

function onEdit(e) {
  e.source.toast('entry');//debug
  var s = e.range.getSheet();
  s.getRange('P1').setValue(JSON.stringify(e));//debug
  if (s.getName() == "Sheet1" && e.range.columnStart == 7 && e.value == "yes") {
    e.source.toast('cond1');//debug
    var tsh = e.source.getSheetByName("Sheet2");
    var trg = tsh.getRange(tsh.getLastRow() + 1, 1);
    s.getRange(e.range.rowStart, 1, 1, s.getLastColumn()).copyTo(trg);
    s.deleteRow(e.range.rowStart);
  }
  if (s.getName() == "Sheet1" && e.range.columnStart == 6 && e.range.rowStart > 1 && !e.value) {
    e.source.toast('cond2');//debug
    const row_new = s.getRange(e.range.rowStart, 1, 1, e.range.columnStart);
    row_new.copyTo(s.getRange(s.getLastRow() + 1, e.range.columnStart));
    s.deleteRow(e.range.rowStart);
  }
}

我添加了我通常用来调试这些脚本的工具。 toasts 帮助我确定编辑页面时代码停止的位置。包含 JSON.stringify(e) 的行我通常会在页面顶部附近放置一些未使用的单元格,以便可以看到事件对象的内部内容。

此代码有效:)

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = event.source.getActiveSheet();
  
  var row = event.range.getRow();
  var col = event.range.getColumn();
  var numColumns = activeSheet.getLastColumn();
  if(activeSheet.getName() == "Sheet1" && col == 7 && event.value == "yes") {
    var targetSheet = ss.getSheetByName("Sheet2");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    activeSheet.getRange(row, 1, 1, numColumns).moveTo(target);
    activeSheet.deleteRow(row);
  }
  if(activeSheet.getName() == "Sheet1" && col == 6  && row > 1 && !activeSheet.getRange(row,col).getValue()=='') {  
    var rowNew = activeSheet.getRange(row,1,1,numColumns);
    rowNew.copyTo(activeSheet.getRange(activeSheet.getLastRow()+1,1,1,numColumns));
    activeSheet.deleteRow(row);
  }
}