Docslist.find执行速度非常慢

时间:2014-05-11 17:23:30

标签: google-apps-script google-drive-api google-docs

我正在使用DocsList.find(),我的代码中的所有内容都运行正常。唯一的问题是,即使文件夹中只有两个文件,也可能需要90秒才能找到指定文件夹中的文件!

我希望有人能够建议一种加速执行的方法。或者,可能是我误解了DocsList的文件夹元素。任何帮助将不胜感激!

谢谢,

奥利

示例代码:

function myFunction() {
var folder = DocsList.getFolderById("MYFOLDERID");
var lastrow = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses 1').getLastRow();
var thissheet = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());

var i = 3;
while (i<= lastrow)
if(SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Add scores to sheets').getRange(i,6).getValue() < 1){

 var getfile = folder.find(thissheet.getSheetByName('Add scores to sheets').getRange(i,3).getValue())[0].getId();
  var cell = SpreadsheetApp.openById(getfile).getSheetByName('Sheet1').getRange(thissheet.getSheetByName('Add scores to sheets').getRange(i,5).getValue());

  if(cell.getValue() < thissheet.getSheetByName('Add scores to sheets').getRange(i,4).getValue()){
  cell.setValue(thissheet.getSheetByName('Add scores to sheets').getRange(i,4).getValue());
  }


  thissheet.getSheetByName('Add scores to sheets').getRange(i,6).setValue(1);
   i++ 
}

else {i++}

}

代码从表单中获取分数&#39;在表单中添加分数&#39;,找到在C列中指定的文件(电子邮件地址),找到命名范围并设置值,前提是当前值为低于新值。我是一名数学老师 - 这一切都来自Google表格测验。

2 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题,Folder.find()花了大约40秒来扫描单个文件夹并返回一个文件。

更快的解决方案是使用Folder.getFiles()并在结果集上循环以获得所需内容..

例如,如果您需要删除文件名中包含“DELETED”字符串的所有文件:

[SLOW] folder.find()

var files = folder.find("DELETE");
for(var x = 0; x < files.length; x++){
  files[x].removeFromFolder(folder)
}

[FAST] folder.getFiles()

var files = folder.getFiles();
for(var x = 0; x < files .length; x++){
  var fileName = files[x].getName();
  if(fileName.indexOf("DELETE") > - 1){
    files[x].removeFromFolder(folder)
  }
}

在我们的特定情况下,第二个版本只用了3秒钟就完成了。

答案 1 :(得分:0)

正如上面的评论所说,您可能希望从限制对getSheetByName的调用开始。如果你声明一个变量,如下所示:

var addScoresToSheetsSheet = 
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Add scores to sheets')

然后在while循环中使用该变量名,如下所示:

if(addScoresToSheetsSheet.getRange(i,6).getValue() < 1){

 var getfile = folder.find(addScoresToSheetsSheet.getRange(i,3).getValue())[0].getId();
  var cell = SpreadsheetApp.openById(getfile).getSheetByName('Sheet1').getRange(addScoresToSheetsSheet).getRange(i,5).getValue());

  if(cell.getValue() < addScoresToSheetsSheet.getRange(i,4).getValue()){
  cell.setValue(addScoresToSheetsSheet).getRange(i,4).getValue());
  }


  addScoresToSheetsSheet.getRange(i,6).setValue(1);
   i++ 
}

它不仅使代码更具可读性,而且还使代码执行得更快。如果这还不够,那么您可能希望将整个工作表读入一个数组,然后在数组上执行代码,如下所述:

https://developers.google.com/apps-script/best_practices#batchOperations