You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Slides转PDF报错saveAndClose不是函数,求解决方案

问题分析与解决方案

核心错误

你调用saveAndClose()的对象错了:templateCopy是DriveApp的File对象,而saveAndClose()是SlidesApp中Presentation实例的方法,两者不是同一个对象,所以会报saveAndClose is not a function错误。

另外,直接用Drive File的getAs()生成PDF时,你对幻灯片的修改还停留在SlidesApp的内存实例里,没有同步到Drive文件,所以生成的PDF还是原模板内容。

正确做法

  1. 用SlidesApp打开复制后的模板文件时,保存Presentation实例,对它完成内容填充后,调用该实例的saveAndClose()来保存修改并关闭。
  2. 之后再通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:16:25