首页 > 解决方案 > 脚本大量使用方法 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 以创建导入范围链接,然后将其粘贴回教师评分簿。这个过程对每个科目重复,然后对每个学生重复。我不知道如何使用数组以及如何使用这些信息存储而不是每个单独的值进行编码。 工作簿副本

标签: google-apps-scriptgoogle-sheets

解决方案


系统消息很可能是由于在嵌套的 for 循环中使用 setValue(有三个 for 循环)加上在嵌套的 for 循环中使用 SpreasheetApp.flush() 导致 Apps Script 引擎无法使用它的内置编写优化算法。

尽量避免在 for 循环中使用 setValue()。为此,您可以使用 JavaScript 数组来保存值,然后使用 setValues() 一次传递多个值,而不是一个一个地传递。


推荐阅读