具有两个onEdit实例的共享电子表格,删除了错误的行

时间:2019-01-08 11:36:43

标签: google-apps-script google-sheets

我正在尝试使用Google表格和Apps脚本创建销售线索管理格式。

apps脚本正在检查工作表 Propsect Interested M 列中的值是否已更改,并根据该值移动排至相应的工作表(感兴趣推迟丢失已预订

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

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

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

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

您可以访问电子表格here

我的代码如下:

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是否只有在第一个完成执行后才能运行?我想,如果发生这种情况,问题将会解决吗? 我希望我能够正确表达我的问题。

2 个答案:

答案 0 :(得分:1)

问题:

传递到e的事件对象onEdit(e)不会改变,如果同时进行两个或更多编辑,并且第一个编辑会更改下一个编辑的行号,e.range.rowStart在执行时,第二个以上的编辑不可靠。

可能的解决方案:

  • 请勿立即删除行。将其标记为删除(在属性服务中保存范围字符串),然后在不使用文档时将其删除(时间触发器)。

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

参考文献:

答案 1 :(得分:0)

我想您应该只基于用户交互触发一个功能,然后在内部执行条件操作。

类似这样的东西:

function onEdit(event_object) {
    var sheet = event_object.range.getSheet();
    var row = event_object.range.getRow();
    var column = event_object.range.getColumn();

    if (sheet.getName() == "Sheet1") {
        // perform operations when Sheet1 is edited
    } else if (sheet.getName() == "Sheet2") {
        // perform operations when Sheet2 is edited
    }
}

参考:

https://developers.google.com/apps-script/reference/spreadsheet/range

https://developers.google.com/apps-script/guides/triggers/events#edit