【发布时间】:2018-11-06 02:08:26
【问题描述】:
如果学分小于 x,我正在使用以下脚本在 Google 电子表格中添加来自学生循环的文件行。该脚本运行良好,但由于每天都在添加电子表格中的数据,现在脚本抛出“超过最大执行时间”错误(我们有超过 2000 个文件)。由于我是脚本新手,我不知道如何优化代码。
有人可以帮我优化代码或任何解决方案,以使执行时间少于 5 分钟。每次与电子邮件进行比较时,都必须将其与许多电子邮件进行比较。请帮忙!
function updated() {
//Final file data (Combined)
var filecombined = SpreadsheetApp.openById("XXXXXXXXXX");
var sheet2 = filecombined.getSheets();
//Folder with all the files
var parentFolder = DriveApp.getFolderById("YYYYYYYYYYYY");
var files = parentFolder.getFiles();
//Current Date
var fecha = new Date();
//Path for each file in the folder
while (files.hasNext()) {
var idarchivo = files.next().getId();
var sps = SpreadsheetApp.openById(idarchivo);
var sheet = sps.getSheetByName('STUDENT PROFILE');
var data = sheet.getDataRange().getValues();
var credits = data[5][1];
//Flat; bandera:1 (new row), bandera:2 (update row)
var bandera = 1;
//Take data from final file (Combined)
var data2 = sheet2[0].getDataRange().getValues();
//If credits are less than X: write
if (credits < 120) {
var email = data[2][1];
var lastrow = filecombined.getLastRow();
var u = 0;
//comparison loop by email, if found it, update and exit the loop
while (u < lastrow) {
u = u + 1;
if (email == data2[u - 1][1]) {
sheet2[0].getRange(u, 3).setValue(credits);
sheet2[0].getRange(u, 4).setValue(fecha);
u = lastrow;
bandera = 2;
}
}
//if that email does not exist, write a new row
if (bandera == 1) {
var nombre = data[0][1];
sheet2[0].getRange(lastrow + 1, 1).setValue(nombre);
sheet2[0].getRange(lastrow + 1, 2).setValue(email);
sheet2[0].getRange(lastrow + 1, 3).setValue(credits);
sheet2[0].getRange(lastrow + 1, 4).setValue(fecha);
}
}
}
SpreadsheetApp.flush();
}
【问题讨论】:
-
如果您使用
SpreadsheetApp.getActive().getSheetByName("STUDENT PROFILE").hideSheet();隐藏工作表,它是否会运行得更快? -
您是否正在显示所有 2000 个文件?也许你也可以隐藏它们。这样屏幕就不必继续更新,最终结果将是相同的。不过,对此不确定。
-
不要在
while (u < lastrow)循环中调用setValue,而是将这些数据存储到一个二维数组中并在循环外调用setValues。 -
您需要阅读电子邮件一次,并创建一个支持比数组遍历更快的查找的数据结构。例如。查看我的解决方案 here、here 和 here。另请阅读此问题:stackoverflow.com/questions/18706085/…
标签: optimization google-apps-script google-sheets