如何处理多个onEdit()函数?

时间:2018-12-06 15:04:36

标签: google-apps-script google-sheets

如果我有一个运行20个单独的onEdit()脚本的工作表,那么如果不同用户大约同时进行2次唯一编辑,会不会出现任何问题?更具体地说:

1)录制编辑的时间分辨率是多少?例如,两个人在同一毫秒内进行编辑的可能性很小,但也许在同一秒内并不是不可能。如果两个人在同一秒钟内进行编辑,会不会将它们识别为单独的编辑?还是可以将每次编辑清楚地识别为一个独特的事件,而不管它们发生的紧密程度如何?

2)如果触发了一个onEdit()脚本,并且未完成,则在进行另一次编辑之前,这是否会导致第二次编辑失败而无法正确评估?

3)我有大约20个脚本在一个工作表上运行,该工作表上有大约20个选项卡,并且在任何给定时间都有大约7个用户。您是否还有其他问题会导致某些onEdit()脚本无法正常工作?

我的脚本检查是否在工作表x的x列中进行了编辑,如果是,则将其复制到下一个工作表并从第一工作表中删除该行。目前大约有30%的时间失败。我不知道为什么过去没有这样做。

我的代码如下:

function onEdit(e){ 
  var edited_range = e.range;

  var edited_row = edited_range.getRow();

  var activeSheet = e.source.getActiveSheet(); 
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 

  var source_sheet = ss.getSheetByName("N.Arb Pitches"); 
  var target_sheet = ss.getSheetByName("N.Arb In Progress");
  var last_row = target_sheet.getLastRow(); 

  var range_values = target_sheet.getRange("A1:A").getValues(); 

  var range_length = range_values.filter(String).length + 1;

  var target_range = target_sheet.getRange(range_length,1); 


  if (activeSheet.getName() == "N.Arb Pitches") { 
        if (edited_range.getColumn() == 13) {
          if (edited_range.getValue().toLowerCase() == "yes") {
             target_sheet.insertRowAfter(last_row);  
             source_sheet.getRange(edited_row,1,1,12).copyTo(target_range); 
            source_sheet.deleteRow(edited_row)  }}}; 

}

每个项目中只有1个onEdit(e)函数,而我的工作表中有这么多个项目。每个项目都具有与上述相同的功能,但工作表名称已更改。

1 个答案:

答案 0 :(得分:1)

在没有任何代码可供审阅的情况下,我假设您的应用程序脚本项目中有多个onEdit()方法。

您可能有如下定义的*.gs个文件:

\** onEdit() defined in, for example, script1.gs *\
function onEdit(e) {...}

还有一个

\** onEdit() defined in, for example, script2.gs *\
function onEdit(e) {...}

如果是这样,那么您有问题。每次您定义一个具有相同名称的方法(在相同的应用程序脚本项目中)时,无论其所在的脚本文件是什么,最后一个定义都将覆盖之前的定义。因此,在您的20个onEdit()函数中,只有最后一个定义的函数才有效。


编辑

使用自己的onEdit()将多个应用程序脚本项目分配给单个电子表格是可行的。但是,如果工作表被多个方大量使用,则这些onEdit()方法可能会引起并发问题。您可以尝试使用LockService来缓解这些问题。