如何解决缓慢循环查找和复制 分析您的代码为什么这段代码很慢?倾销整个范围结果参考
我的代码目前正在运行,但需要很长时间才能完成。此外,如果我有数百个结果,则会出现超时问题。
您可以在此处重现该问题:
https://docs.google.com/spreadsheets/d/1ggVvxquruYfckNWxhsV6-Od2J8QIkMOYpJps7qz9PkI/edit?usp=sharing
这是代码:
for(var i = 0; i<rapport.length-1; i++) {
if(colonneCode[i] == code.getResponseText()) {
ligneCode[v] = i;
v++;
}
}
for(var i = 0; i<ligneCode.length;i++) {
var codeLastRow = 12;
var copySource = sheet.getRange(ligneCode[i]+10,1,16);
var copyTarget = feuille.getRange(feuille.getLastRow()+1,16);
copyTarget.setValues(copySource.getValues());
copySource.copyTo(copyTarget,{formatOnly:true});
}
点击个性化菜单(Évaluations Philippe Caron)-> Classement personnalisé->第一个输入框“2”->第二个输入框“e”->第三个是你想要新表的名字。
解决方法
分析您的代码
我使用这些片段来检查代码的时间。
let start = new Date()
Logger.log("before first for loop")
Logger.log(new Date().getTime() - start.getTime())
正如您可能已经猜到的,对于您工作表上的 e
示例,直到第二个 for 循环的大部分代码都在大约 1 秒内运行。然而,第二个 for 循环花费了大约 45 秒。这部分:
for(var i = 0; i<ligneCode.length;i++) {
var codeLastRow = 12;
var copySource = sheet.getRange(ligneCode[i]+10,1,16);
var copyTarget = feuille.getRange(feuille.getLastRow()+1,16);
copyTarget.setValues(copySource.getValues());
copySource.copyTo(copyTarget,{formatOnly:true});
}
为什么这段代码很慢?
因为在每次迭代中,它都会调用 getRange
、getValues
、setValues
、copyTo
。所有这些命令都要求 Apps 脚本执行从电子表格中读取和写入。这很慢。
倾销整个范围
在大型 2D 数组和 setValues
中收集整个范围要快得多。这将需要首先在 Apps 脚本中构建范围。因此,不是将行的索引号存储在 ligneCode
中,而是将 整行 存储在 output
中。
顺便说一下,您可以使用 array.push(item)
将一个项目添加到数组的末尾。无需跟踪索引号。
所以不是这样:
var ligneCode = [];
for(var i = 0; i<rapport.length-1; i++) {
if(colonneCode[i] == code.getResponseText()) {
ligneCode[v] = i;
v++;
}
}
构建一个数组,代表您将在新工作表中粘贴的内容。
var output = [];
for (var i = 0; i < rapport.length - 1; i++) {
if (colonneCode[i] == code.getResponseText()) {
output.push(rapport[i]);
}
}
然后,一旦您有了新工作表 feuille
,您需要做的就是:
var target = feuille.getRange(
11,// first row
1,// first column
output.length,// the height of the output
output[0].length // the width of the output
);
target.setValues(output);
结果
现在以 e
示例开始,整个脚本大约需要 2 秒才能运行。
参考
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。