首页 > 解决方案 > 具有两个 onEdit 实例的共享电子表格,删除错误的行

问题描述

我正在尝试使用 Google 表格和应用程序脚本创建潜在客户管理格式。

应用程序脚本正在检查工作表PropsectInterested的M列中的值是否已更改,并根据值将行移动到相应的工作表(InterestedPostponedLostBooked

该电子表格与我的团队共享,他们将进行更改,并与多个用户同时编辑。

现在,问题在于,一旦onEdit触发了两个 s,并且如果两者都需要移动行,则第一个实例会正常运行,但第二个实例会删除错误的行。

例如:在工作表Prospect中,第 2 行和第 3 行的状态同时更改为Lost& Postponed。现在,Lost被正确触发,但是,Postponed实例删除了第 4 行(现在是第 3 行,因为之前删除了第 2 行)。

我试图添加lockservice到代码中,以便只有一个实例正在运行,但这似乎并不能解决问题,因为事件对象仍在考虑未更新的行号。甚至尝试flush()在代码的开头和结尾添加,但也没有用。

您可以在此处访问电子表格。

我的代码如下:

function Master(e) {
  var lock = LockService.getScriptLock();
  var SS = e.source;
  var Sheet = e.source.getActiveSheet();
  var Range = e.range;
  if(Sheet.getName() == "Prospect" && Range.getColumn() == "13" || Sheet.getName() == "Interested" && Range.getColumn() == "13"){
    moveRows(SS,Sheet,Range);
  } 
lock.releaseLock();
}

function moveRows(SS,Sheet,Range) {
  var val1 = Sheet.getRange(Range.getRow(),1,1,10).getDisplayValues();
  val1 = String(val1).split(",");
  var tar_sheet = SpreadsheetApp.getActive().getSheetByName(Range.getValue());
  var row = tar_sheet.getRange(tar_sheet.getLastRow()+1,1,1,val1.length).setValues([val1]);
  Sheet.deleteRow(Range.getRow());
  }
}

有没有办法让第二个onEdit只有在第一个完成执行后才能运行?我想,如果发生这种情况,问题会解决吗?我希望我能够正确地传达我的问题。

标签: google-apps-scriptgoogle-sheets

解决方案


问题:

e传递给 a的事件对象onEdit(e)不会改变,当同时完成两个或多个编辑并且第一个编辑改变下一个编辑的行e.range.rowStart号时,第二个 + 编辑在执行时不可靠。

可能的解决方案:

  • 不要立即删除行。将它们标记为删除(将范围字符串保存在属性服务中)并在文档不使用时稍后删除它们(时间触发器)。

  • 或者,添加代码保护:检查range.getValue()===e.value. 如果它们相等,则继续moveRowselse 将offset范围保持 -1 行,直到它们相等。

参考:


推荐阅读