google-apps-script - 脚本大量使用方法 Range.getValue
问题描述
我有一个可以运行的脚本,但需要很长时间才能完成。我在各种不同的工作簿和工作表中有许多有效的复制粘贴。我对脚本的了解是有限的,我很高兴我设法让它工作。运行时间虽然大约 15 分钟,但真的很垃圾,我什至还没有设置它来完成所有必需的循环。灯泡建议说:
脚本大量使用方法 Range.getValue。Collapse
File: student reflection copy Line: 17
该脚本使用了一种被认为成本高昂的方法。每次调用都会生成对远程服务器的耗时调用。这可能会对脚本的执行时间产生严重影响,尤其是在大数据上。如果性能是脚本的问题,您应该考虑使用另一种方法,例如 Range.getValues()。
但我真的不知道我能做什么。我无法再次开始这个项目,并且总是会在不同的工作表上复制粘贴来设置它。任何帮助都会受到极大的欢迎。这是我的工作代码:
function myFunction() {
var spreadsheet = SpreadsheetApp.getActive();
var studentID = spreadsheet.getSheetByName('Sheet11');
var sourceSheet = spreadsheet.getSheetByName('Sheet6');
var createLink = spreadsheet.getSheetByName('Sheet14');
var i ,j, k;
for( var k = 1; k< 3; k++) {
// copy studentID
studentID.getRange(k, 2).copyTo(createLink.getRange(4, 4 ,{contentsOnly: true}));
for( var i = 1; i< 21; i++) {
//copy students subject
var subjectName = sourceSheet.getRange(i+1,7*k-5).getValue();
if (subjectName =="") {
break;
}else {
createLink.getRange(4, 6).setValue(subjectName)
//copy row number of reflection
for (var j = 1; j<31; j++){
var rownumber = j+5;
createLink.getRange(4, 8).setValue(rownumber);
SpreadsheetApp.flush();
//copy link of student reflection into teacher marksheet
var markSheetID = sourceSheet.getRange(i+1, 7*k-3).getValue();
var groupNumber = sourceSheet.getRange(i+1,7*k-2).getValue();
var MarkSheet = SpreadsheetApp.openById(markSheetID).getSheets()[groupNumber-1];
var linkvalue = createLink.getRange(4, 10).getValue();
MarkSheet.getRange(2+k, 6*j).setValue(linkvalue);}
}
}
}
}
我知道这不是很好,但我以前从未做过这些事情。关于如何加快此过程的任何建议?
更新:请在附件中找到工作簿。将学生信息粘贴到工作表 14 以创建导入范围链接,然后将其粘贴回教师评分簿。这个过程对每个科目重复,然后对每个学生重复。我不知道如何使用数组以及如何使用这些信息存储而不是每个单独的值进行编码。 工作簿副本
解决方案
系统消息很可能是由于在嵌套的 for 循环中使用 setValue(有三个 for 循环)加上在嵌套的 for 循环中使用 SpreasheetApp.flush() 导致 Apps Script 引擎无法使用它的内置编写优化算法。
尽量避免在 for 循环中使用 setValue()。为此,您可以使用 JavaScript 数组来保存值,然后使用 setValues() 一次传递多个值,而不是一个一个地传递。
推荐阅读
- php - 为什么这个查询不能正常工作?
- unicode - .net 上的奇怪标准化
- firebase - Firebase 托管配置,重写除一个 url 之外的所有内容
- java - 使用 SpringIntegration Java DSL 将消息发送到特定的 RabbitMQ 队列
- ipython - 我可以从 IPython.display.Markdown 获取 html 字符串吗?
- ios - 如何比较不同数组的2个元素?
- windows - 从 Windows 任务管理器启动 R 子进程失败
- python - 张量评估错误
- android-studio - 由于尝试生成签名的 apk,Android Studio 将不会调试(仅构建)
- html - 如何在不影响任何其他样式的情况下从我的按钮中删除轮廓