【发布时间】:2018-03-23 16:46:18
【问题描述】:
下面的代码可以很好地仅将我的 Google 表格文件的“采购订单模板”表格以 PDF 格式保存到指定的 Google 云端硬盘文件夹“Purchase_Orders”。唯一的问题是该功能需要 10 多秒才能运行。代码中是否有可以压缩的东西来加快这个脚本的运行过程?
function checkSheet() {
var sheetName = "POTemplate";
var folderID = "Purchase_Orders";
var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var poNo = sourceSheet.getRange("G5").getValue();
var shipTo = sourceSheet.getRange("E9").getValue();
var pdfName = shipTo + " Purchase Order " + poNo;
var folder = DriveApp.getFoldersByName(folderID);
var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy(folder));
var source = destSpreadsheet.getSheetByName(sheetName).getDataRange();
source.copyTo(source, {contentsOnly: true});
var sheets = destSpreadsheet.getSheets();
for (i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() != sheetName){
destSpreadsheet.deleteSheet(sheets[i])}};
var theBlob =
destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
var newFile = folder.next().createFile(theBlob);
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
var strUrl = newFile.getUrl()
var html = HtmlService.createTemplateFromFile("NewTab");
html.strUrl = strUrl
SpreadsheetApp.getUi().showModelessDialog(html.evaluate(),
"Congratulations! "+ pdfName + " is now saved.")
}
【问题讨论】:
-
您似乎正在克隆当前的电子表格,删除除一张以外的所有工作表,然后将其转换为 pdf,然后删除克隆的电子表格。为什么不直接隐藏当前电子表格中不想打印的每张工作表,然后将其转换为 PDF,然后再次取消隐藏工作表?
-
希望尽可能多地消除手动步骤/鼠标点击。通过 Apps 脚本遵循您的建议可能是答案,但让我们的员工手动完成这些步骤可能会比现有代码慢。想法?
-
您可以使用 Apps 脚本隐藏工作表:
wb.getSheets().forEach(function (s) { if (s.getName() != "POTemplate" ) { s.hideSheet(); } ); /* make pdf from wb */ wb.getSheets().forEach(function (s) { s.unhideSheet(); }); -
我发现
getRange和setRange要花很多时间,尽量少,把数据保存在数组中而不是在电子表格中查找