我正在使用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表格测验。
答案 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