我有一个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%。
答案 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 :(得分:0)
无法确保onEdit或其他触发器不会“失火”,但是可以减少发生这种情况的可能性