如何修复onEdit()时间戳中的故障?

时间:2015-11-19 01:05:14

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

我有一个简单的时间戳脚本,如下所示。 由于条目是在B列中完成的,因此脚本会做出魔术并在A列中放置时间和日期标记。

我有一些小问题。 我有8名员工,我自己在这张床单上注册。有时时间戳不起作用,并且将A列留空。 我认为脚本运行缓慢并通过缓慢注册进行测试。 (每个注册表之间1-2秒。) 但它仍然留下一些空洞。 我无法共享原始文件,因为它处于封闭网络中。

我在这个文件上有大约5个脚本,所有时间戳。它有故障因为我有太多脚本吗?我在这里做错了什么?

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  if( s.getName() == "Бүх Бүртгэл" ) { //checks that we're on the correct sheet
    var r = s.getActiveCell();
    if( r.getColumn() == 2 ) { //checks the column
      var nextCell = r.offset(0, -1);
      if( nextCell.getValue() === '' ) //is empty?
        nextCell.setValue(new Date());
    }
  }
}

1 个答案:

答案 0 :(得分:1)

理论解释

调用onEdit()简单触发器以响应电子表格编辑事件,并与特定用户界面实例相关联。因为它也是一个绑定脚本,它可以通过像Sheet.getActiveCell()这样的方法访问相关UI的信息。在您共享的原始脚本中,该方法用于确定已编辑的单元格,但该方法报告光标当前所在的位置,这不一定是刚刚拥有的单元格已被编辑。在检测编辑,生成事件,调用触发器功能之间存在大量延迟的机会。如果有多个用户共享工作表,则同步他们的副本也可以延迟调用触发器功能。随着延迟的可能性和潜在持续时间增加,其动作触发该功能的用户将移动到不同小区的可能性也会增加,导致onEdit()功能中的退出条件绕过写入时间戳。

该怎么办?

调用您的onEdit()触发器函数以响应编辑事件,并将该事件的详细信息作为Event Object传递给触发器函数。不要调用SpreadsheetApp方法来访问当前光标位置,而是使用此事件对象;由于处理延迟,它更快且更不易受到变化的影响。最重要的是,由于它包含有关实际编辑事件的信息,因此它不依赖于用户在平均时间内所做的事情。

在这里,我重新组织了您的触发器功能,以便使用事件对象并提高效率,因为它可以测试"便宜"条件优先,离开"昂贵"服务电话直到稍后。

function onEdit(event) {
  var r = event.range;
  if( r.getColumn() == 2 ) { //checks the column
    var s = r.getSheet();
    if( s.getName() == "Бүх Бүртгэл" ) { //checks that we're on the correct sheet
      var nextCell = r.offset(0, -1);
      if( nextCell.getValue() === '' ) //is empty?
        nextCell.setValue(new Date());
    }
  }
}