【问题标题】:Exported Google Slides presentation does not include recent changes导出的 Google 幻灯片演示文稿不包含最近的更改
【发布时间】:2018-07-11 15:22:01
【问题描述】:

我编写了一些代码来自动将用户名添加到模板 Google 幻灯片文件中。这个模板本质上是一个证书,我正在尝试为每个用户自动生成所述证书。

不幸的是,当我尝试将幻灯片文件转换为 PDF 时,它会转换没有用户名的幻灯片 - 例如基本上只是模板文件被导出。它肯定会提取正确的文件 ID,但仍然无法正常工作。我能想到的唯一问题是,当代码从DriveApp 获取 blob 数据时,演示文稿还没有保存更改。

function buildCertificate() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'),
      rows = sheet.getDataRange().getValues(),
      template = DriveApp.getFileById('some file id'),
      destination = DriveApp.getFolderById('some folder id'),
      i = 1;

  while (i < rows.length) {
    if (rows[i][3] != 'Y') {
      var file = template.makeCopy(rows[i][0] + ' ' + rows[i][1], destination),
      id = file.getId(),
      slide = SlidesApp.openById(id).getSlides()[0],
      shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 60, 207, 600, 110),
      textRange = shape.getText(),
      textStyle = textRange.getTextStyle();

      textRange.setText([rows[i][0] + ' ' + rows[i][1]]);
      textStyle.setFontSize(40);
      textStyle.setForegroundColor('#F9B300');

      var paragraphStyle = textRange.getParagraphs()[0].getRange().getParagraphStyle();
      paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);

      var theBlob = DriveApp.getFileById(id).getBlob().getAs('application/pdf').setName('test'),
      newFile = DriveApp.getFolderById("some folder id").createFile(theBlob);
    }

    sheet.getRange(i + 1, 4).setValue('Y');
    i++;
  } 
}

【问题讨论】:

  • 在使用DriveApp获取文件数据之前,您需要关闭打开的演示文稿以刷新挂起的写入操作
  • 尝试在 slidesapp 对象上添加 saveandclose() 方法

标签: google-apps-script export-to-pdf google-slides-api


【解决方案1】:

根据 Apps 脚本 SlidesApp 文档,您可以通过使用 saveAndClose() 关闭幻灯片来强制对幻灯片 Presentation 进行任何挂起的写入。脚本执行结束时会自动关闭打开的演示文稿,但对于像您这样的用例,这种自动刷新发生得太晚而无用:

saveAndClose():

保存当前的Presentation。导致刷新和应用挂起的更新。

对于每个打开的Presentation,脚本执行结束时会自动调用saveAndClose() 方法,即使脚本执行因错误而终止。

无法编辑已关闭的 Presentation。使用SlidesApp 上的一种打开方法重新打开给定的演示文稿进行编辑。

您的代码使用的表示绑定在您的变量 slide 中,因此更改循环结构以在您的 DriveApp 代码之前关闭它将确保 Blob 数据反映最新的更改。

while (i < rows.length) {
  if (rows[i][3] != 'Y') {
    var file = template.makeCopy(rows[i][0] + ' ' + rows[i][1], destination),
        id = file.getId(),
        presentation = SlidesApp.openById(id),
        slide = presentation.getSlides()[0],
        shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 60, 207, 600, 110),
        textRange = shape.getText(),
        textStyle = textRange.getTextStyle();

    textRange.setText([rows[i][0] + ' ' + rows[i][1]]);
    textStyle.setFontSize(40);
    textStyle.setForegroundColor('#F9B300');

    var paragraphStyle = textRange.getParagraphs()[0].getRange().getParagraphStyle();
    paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);

    // Flush the changes we've made to the instantiated template presentation.
    presentation.saveAndClose();

    // Reopen the file with DriveApp -- could perhaps use the existing `file` reference, e.g.:
    // var theBlob = file.getAs(MimeType.PDF).setName('test');
    var theBlob = DriveApp.getFileById(id).getAs(MimeType.PDF).setName('test');
    // Create the PDF in the desired Drive folder.
    DriveApp.getFolderById("some folder id").createFile(theBlob);
  }

  sheet.getRange(i + 1, 4).setValue('Y');
  i++;
}

【讨论】:

    【解决方案2】:

    正如 cmets 中所说,您在进行更改后不会保存和关闭文件。

    换行:

    slide = SlidesApp.openById(id).getSlides()[0],
    

    与

    file = SlidesApp.openById(id),
    slide = file.getSlides()[0],
    

    行后

     paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);
    

    添加行

     file.saveAndClose();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多