简单的谷歌脚本运行异常缓慢



我正在构建一个Sheets数据库设置,其中一些代码运行速度非常慢(有时不是100%(。这个特别让我困惑:

function onEdit(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = SpreadsheetApp.getActiveSheet();
var rc = s.getActiveCell().getColumn();
var rr = s.getActiveCell().getRow()
var job = s.getRange(2,2).getDisplayValue();
if (rc == 2 && rr == 2 && s.getName()=='Entry' && job != "") {
s.getRange("C1").setValue("LOADING...");
SpreadsheetApp.flush();
var helperSheet = ss.getSheetByName("Helper");    
var testVals = helperSheet.getRange("E1:E").getValues();
var firstRow = testVals.filter(String).length+1;
var workData = helperSheet.getRange("E3:J"+firstRow).getDisplayValues();
s.getRange("C5:H").clearContent(); //tech to end time (work chart)
s.getRange(5,3,firstRow-2,6).setValues(workData); //tech to end time (work chart)
SpreadsheetApp.flush();
s.getRange("C1").clearContent();    
}
}

在我清理了一点之后,我通常会在2-3秒内完成,但有时(在我的客户身上,100%的时间(,它会在30秒内超时。你能看到我在这里做错了什么吗?我知道它有太多的函数调用,但我已经尽可能地减少了这些调用。在这一点上,我唯一的想法是flush((调用是一个问题。我使用这些;加载";尽可能早地出现,并且只有在其他所有操作完成后才清除。如果没有它们,它只会出现半秒钟。

任何帮助都将是美妙的,因为它可能有助于指导我使用其他脚本,这些脚本也在慢慢运行。

此外,在阅读了其他运行/运行缓慢的脚本的各种其他答案后,我发现了使用可安装触发器的想法。有什么原因可以让我的脚本运行得更快吗?

更新:我意识到我可以将LOADING文本添加/删除调用移到if测试之外,从而删除flush((调用。通过这种方式,编辑另一个单元格可以同时添加和删除文本,这样用户就看不到它。在我的电脑上,它现在运行得很快。然而,我的客户还没有测试过。所以,我认为现在有两个问题:1(flush((真的会让脚本慢那么多吗?2( 在我的代码中还有什么让它变慢的愚蠢的事情吗。。。有时

新代码:

function onEdit(e){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = SpreadsheetApp.getActiveSheet();
var rc = s.getActiveCell().getColumn();
var rr = s.getActiveCell().getRow()
var job = s.getRange(2,2).getDisplayValue();
s.getRange("C1").setValue("LOADING...");
if (rc == 2 && rr == 2 && s.getName()=='Entry' && job != "") {
var helperSheet = ss.getSheetByName("Helper");    
var testVals = helperSheet.getRange("E1:E").getValues();
var firstRow = testVals.filter(String).length+1;
var workData = helperSheet.getRange("E3:J"+firstRow).getDisplayValues();
s.getRange("C5:H").clearContent(); //tech to end time (work chart)
s.getRange(5,3,firstRow-2,6).setValues(workData); //tech to end time (work chart)
}
s.getRange("C1").clearContent();    
}

试试这个:

function onEdit(e) {
const sh = e.range.getSheet();
const job = sh.getRange(2, 2).getDisplayValue();
if (e.range.columnStart == 2 && e.range.rowStart == 2 && sh.getName() == 'Entry' && job != "") {
sh.getRange("C1").setValue("LOADING...");
let hsh = e.source.getSheetByName("Helper");
let workData = hsh.getRange("E3:J" + hsh.getLastRow()).getDisplayValues();
sh.getRange(5, 3, sh.getLastRow() - 4, 6).clearContent();
sh.getRange(5, 3, workData.length, 6).setValues(workData);
}
sh.getRange("C1").clearContent();
}

最新更新