gpt4 book ai didi

javascript - 谷歌脚本运行速度太慢

转载 作者:行者123 更新时间:2023-12-03 06:13:06 25 4
gpt4 key购买 nike

我目前正在编写一个谷歌脚本,不幸的是它运行得太慢了。 (超过 6 分钟限制)。该脚本打开一个文档,替换两个字符串(在谷歌工作表中设置),将其保存为 PDF。没什么特别的。

我有大约 200 个这样的文档要通过这个脚本运行,但在 6 分钟的限制内,它只成功运行了 6 个。谷歌脚本就是这么慢吗,还是我不小心制作了有史以来效率最低的谷歌脚本?

function createAllPDF() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var range = SpreadsheetApp.getActiveSheet().getActiveRange()
var numRows = SpreadsheetApp.getActiveSpreadsheet().getLastRow() - 1;
for(var i = 9; i <= numRows; i++) {
var thisRange = sheet.getRange("A" + n + ":C" + n);
var fond = thisRange.getCell(1, 1).getValue();
var adresse = thisRange.getCell(1, 3).getValue();
thisRange.setBackground('#cfe2f3');
genDoc(fond, adresse);
}
}
//// CREATE PDF ////////////////// FUNCTION FOR GENERATING THE PDF /////////////////////////////////
function genDoc(fond, adresse) {
// Finds the template and duplicate it into a new file.
var template = ("xxxxxxxxxxxx");
var docId = DriveApp.getFileById(template).makeCopy().getId();
// Opens the newly created Document for editing
var doc = DocumentApp.openById(docId);
var body = doc.getActiveSection();
// Renames the newly generated document
var newName = doc.setName(fond);
// Replaces each with the parsed variables.
body.replaceText("%FOND%", fond);
body.replaceText("%ADRESSE%", adresse);
doc.saveAndClose();
//Adds the PDF ID to the invoice_input sheet
var conv = DriveApp.getFileById(docId);
var pdf = conv.getAs("application/pdf");
var fileId = DriveApp.createFile(pdf).getId();
// Gets the PDF file by ID
var thisPDF = DriveApp.getFileById(fileId);
// The ID of the folder I'd like to put the PDF into.
var folderId = "xxxxxxxxxxx";
// Gets the folder by ID
var targetFolder = DriveApp.getFolderById(folderId);
// Adds the PDF to the Folder
targetFolder.addFile(thisPDF);
// Removes the PDF from the root.
var root = DriveApp.getRootFolder().removeFile(thisPDF);
// Deletes the duplicated document
DriveApp.getFileById(docId).setTrashed(true)
return fileId;
}

任何有关如何优化的指示将不胜感激。我对谷歌脚本和编程非常陌生,所以没什么大不了的,呵呵。如果我错误地使用了该板,请道歉。请告诉我,我会改正。

最佳答案

我立即注意到您有一个 undefined variable n。它在行中:

var thisRange = Sheet.getRange("A"+ n + ":C"+ n);

这应该会使代码完全无法使用。将这些变量更改为 i 后,我能够成功运行代码整整 6 分钟。在那段时间里,它能够循环大约41.5次。它为第 9-53 行创建了文件,但在能够将最后一个文件添加到正确的文件夹之前停止了。

查看执行记录,最长的操作是创建、移动和删除文件的几次调用。

您还定义了范围,然后从不使用此变量,从而使其变得不必要。

我按照自己多次使用的结构和方法重写了代码。我能够完全处理第 9-59 行。此方法能够将其扩展 6 行。我建议添加一个超时触发器,每 5 分 55 秒停止该功能,然后 5 秒后再次重新启动。有关 javascript 时间的指南可以找到 here 。我也使用不同的匹配方法;使用正则表达式。有关于正则表达式以及如何最大限度地减少处理时间的广泛指南。我在这方面还远未精通。

function PDFCreator() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Test Sheet");
var lastRow = sheet.getLastRow();
var checkRange = sheet.getRange(9, 1, (lastRow - 8), 3);
var check = checkRange.getBackgrounds();
var lightBlue = "#cfe2f3";
var template = DriveApp.getFileById("1RslWGntAwfLTSytOv_IoOv2_iBhSmsK0ZtEVWaq3ezM");
var folder = DriveApp.getFolderById("0BwZ6LWJudkOHaTFiQjd5cFA5OG8");
for (i = 0; i < check.length; i++) {
if (check[i] == lightBlue) {
continue;
} else {
var dataRow = sheet.getRange((i + 9), 1, 1, 3);
var fond = sheet.getRange((i + 9), 1, 1, 1).getValue();
var adresse = sheet.getRange((i + 9), 3, 1, 1).getValue();
var docName = fond + ".pdf";
var docCopy = template.makeCopy(docName, folder);
var docId = docCopy.getId();
var docToEdit = DocumentApp.openById(docId);
var docBody = docToEdit.getBody();
docBody.replaceText(/\%{1}[F][O][N][D]\%{1}/g, fond);
docBody.replaceText(/\%{1}[A][D][R][E][S][S][E]\%{1}/g, adresse);
docToEdit.saveAndClose();
var fileToPDF = DriveApp.getFileById(docId);
var pdfBlob = fileToPDF.getAs(MimeType.PDF);
var pdfRoot = DriveApp.createFile(pdfBlob).setName(docName);
var pdf = pdfRoot.makeCopy(folder);
pdfRoot.setTrashed(true);
fileToPDF.setTrashed(true);
dataRow.setBackground(lightBlue);
}
}
}

您会注意到我将 for()if() 嵌套在 main 函数中。这样,您就不会在函数之间一遍又一遍地来回传递信息。一般来说,您在循环外部定义的内容越多,您需要进行的调用就越少。我可以在 for 循环外部设置更多变量,以进一步扩展其运行。

基本上,这是一个很长的过程,不可能在 6 分钟内运行 200 次。您可以将其扩展到大约 55/60 行,并且效率完美,但此时您只需要再次运行它即可。

关于javascript - 谷歌脚本运行速度太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39233844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com