Google Slides转PDF报错saveAndClose不是函数,求解决方案
问题分析与解决方案
核心错误
你调用saveAndClose()的对象错了:templateCopy是DriveApp的File对象,而saveAndClose()是SlidesApp中Presentation实例的方法,两者不是同一个对象,所以会报saveAndClose is not a function错误。
另外,直接用Drive File的getAs()生成PDF时,你对幻灯片的修改还停留在SlidesApp的内存实例里,没有同步到Drive文件,所以生成的PDF还是原模板内容。
正确做法
- 用SlidesApp打开复制后的模板文件时,保存
Presentation实例,对它完成内容填充后,调用该实例的saveAndClose()来保存修改并关闭。 - 之后再通过Drive File对象生成PDF,此时Drive文件已经同步了修改后的内容。
修改后的代码
function generateCerts() { var ss = SpreadsheetApp.openById('the spreadsheet'); var sheet = ss.getSheetByName('Sheet1'); var data = sheet.getDataRange().getValues(); var templateId = 'the template'; var folder = DriveApp.getFolderById('the folder'); // some other code for (var i = 1; i < data.length; i++) { // 复制模板文件到目标文件夹 var templateCopy = DriveApp.getFileById(templateId).makeCopy(folder); // 打开复制后的演示文稿,保存Presentation实例 var presentation = SlidesApp.openById(templateCopy.getId()); var slide = presentation.getSlides()[0]; var shapes = slide.getShapes(); // 这里执行填充幻灯片内容的代码 var certificateName = school + "_Certificate"; // 通过Presentation实例修改文件名称,确保同步 presentation.setName(certificateName); // 保存修改并关闭演示文稿,将内容同步到Drive文件 presentation.saveAndClose(); // 此时Drive文件已是修改后的内容,生成PDF var certBlob = templateCopy.getAs('application/pdf').setName(certificateName + '.pdf'); folder.createFile(certBlob); } }
关键说明
- 所有幻灯片的编辑操作都基于
presentation这个SlidesApp实例,包括重命名,这样能保证修改内容和Drive文件同步。 - 必须调用
presentation.saveAndClose(),只有这一步能把内存中的修改写入Drive文件,之后生成的PDF才会是填充后的证书内容。
内容的提问来源于stack exchange,提问作者Geb
相关产品推荐
相关产品推荐

