我有一个简单的时间戳脚本,如下所示。 由于条目是在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());
}
}
}
答案 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());
}
}
}