【问题标题】:How to ensure onEdit functions do not miss-fire如何确保 onEdit 函数不会误触发
【发布时间】:2019-06-25 19:18:03
【问题描述】:

我有一个谷歌表,用户可以在其中扫描产品的条形码。我需要记录扫描产品的日期和时间,因此构建了一个 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% 的时间。

【问题讨论】:

  • 我能问一下你的情况吗?例如,在以下情况下,有一种解决方法。 1. 将值放入“B”列的空单元格中。在这种情况下,您可以输入各种值。 2. 单元格的值被替换为相同的值。例如,当将值done 放入“B”列时,将触发 OnEdit 触发器。 3. 例如,当复选框为 ON 或 OFF 时,触发 OnEdit 触发器。您可以在here查看示例情况。

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


【解决方案1】:

要求:

增强脚本以更快地运行以跟上快速扫描时间。


解决办法:

使用事件对象对你有利,你不需要花哨的 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

【讨论】:

  • 虽然“要求”会减少 onEdit 触发器失火的发生,但这并不能完全消除这种情况的发生。
  • 我正在解释这个问题,因为脚本运行速度不够快,无法跟上用户的快速扫描,这就是我改进性能的原因。如果我误解了这个问题,那么我很抱歉。
  • 无需道歉,没有人被冒犯。恕我直言,如果您还假设标题正确地总结了问题/他的 OP 正在寻找什么,那么您的答案会更好。如果您认为没有,请要求澄清。
【解决方案2】:

没有办法确保 onEdit 或其他触发器不会“失火”,但您可以减少发生这种情况的机会

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多