导出的Google幻灯片演示文稿不包含最近的更改

时间:2018-07-11 15:22:01

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

我编写了一些代码,以自动将用户名添加到模板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++;
  } 
}

2 个答案:

答案 0 :(得分:2)

根据Apps脚本SlidesApp文档,您可以使用saveAndClose()关闭幻灯片,以强制对幻灯片Presentation进行任何待处理的写入。当脚本执行结束时,将自动执行打开的演示文稿的关闭,但是对于您这样的用例,这种自动刷新发生得太晚了,无法使用:

  

saveAndClose()

保存当前的Presentation。导致刷新和应用待处理的更新。   

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

  封闭的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++;
}

答案 1 :(得分:1)

正如评论中所说,您所做的更改不是保存和关闭文件。

替换行:

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

使用

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

行后

 paragraphStyle.setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);

添加行

 file.saveAndClose();