如何确保onEdit功能不会失火

时间:2019-06-25 19:18:03

标签: google-apps-script google-sheets triggers

我有一个Google工作表,用户可以在其中扫描产品的条形码。我需要记录扫描产品的日期和时间,因此已经建立了一个onedit脚本来执行此操作。但是,它并不能始终触发。

function onEdit(event) { 
var eventRange = event.range;
var s = SpreadsheetApp.getActiveSheet();
if ( s.getName() == "Dolly Returns") {
if (eventRange.getColumn() == 2) { 
var columnARange = 
SpreadsheetApp.getActiveSheet().getRange(eventRange.getRow(), 1, 
eventRange.getNumRows(), 1);
var values = columnARange.getValues();
for (var i = 0; i < values.length; i++) {
values[i][0] = new Date();
}
columnARange.setValues(values);
}
}
}

如果我开始(相对快速地)编辑B列中的单元格,那么代码似乎很难为每次编辑更新A列。如果您在每次编辑之间暂停几秒钟,确实可以工作,但是我希望可以对代码进行改进,以确保其触发时间为100%。

2 个答案:

答案 0 :(得分:0)

要求:

增强脚本以使其运行更快,以适应快速的扫描时间。


解决方案:

充分利用事件对象,无需花哨的for循环和getValues()编写此脚本,它只会减慢脚本速度。实际上,您只需要工作表名称和编辑的行/列。

function onEdit(event) {
  var sh = event.source.getActiveSheet();
  if (sh.getName() === 'Dolly Returns') {
    var col = event.range.getColumn();
    if (col === 2) {
      var row = event.range.getRow();
      sh.getRange(row, 1).setValue(new Date());
    }
  }
}

说明:

此脚本仍在检查以确保正在编辑正确的工作表和列,但我已删除了您不需要的任何多余位。就像我之前说的,我们所需要的只是工作表名称和编辑的行/列(这就是我所定义的全部)。


时间:

好吧,这是您变得更加有趣的地方。我对每个脚本进行了10次测试。结果如下:

Old         New
-----       -----
0.120       0.062
0.132       0.061
0.196       0.060
0.125       0.052
0.130       0.055
0.118       0.054
0.128       0.057
0.138       0.054
0.124       0.056
0.126       0.060

如您所见,这是一个很大的改进,与以前相同的功能,其速度要快两倍。我们仍在检查工作表名称和列,并像脚本一样编写日期。


参考文献:

  1. Event Objects

答案 1 :(得分:0)

无法确保onEdit或其他触发器不会“失火”,但是可以减少发生这种情况的可能性

  1. 通过设计防止用户连续快速地应用更改
  2. 降低电子表格的复杂度,使其能够尽快进行重新计算
  3. 优化onEdit脚本以尽快执行