如果我有一个运行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)函数,而我的工作表中有这么多个项目。每个项目都具有与上述相同的功能,但工作表名称已更改。
答案 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
来缓解这些问题。