Google Apps脚本,仅在保存的pdf中显示模板

问题描述

查看保存的PDF文件时,名称不会更改为工作表中的相应名称。知道为什么吗?我认为这与异步/等待有关。

取自电子表格的名称和usn {{name}}将替换为实际名称,但在生成的PDF中未显示。 请帮忙

function myFunction() {
  var dataspreadsheet = "https://docs.google.com/spreadsheets/d/XXXXX/edit"
  var slide = SlidesApp.getActivePresentation();
  var ss = SpreadsheetApp.openByUrl(dataspreadsheet)
  var sheet = ss.getSheetByName('Sheet1')
  var startRow = 2; 
  var numRows = 3; 
  var datarange = sheet.getRange(startRow,1,numRows,3);
  var data = datarange.getValues();
  console.log(data);
  for (var i in data) {
    var slides = slide.getSlides();
    var template = slides[0]
    var row = data[i];
    var name = row[0]; // First column
    var usn = row[1]; //Second column
    template.replaceAllText("{{name}}",name);
    var options =
      {
        "contentType" : "application/pdf","muteHttpExceptions": false
      };
  var presentationcopyId = 'YYY'
    var blob = DriveApp.getFileById(presentationcopyId).getBlob();
    var folderId = "ZZZ"
    DriveApp.getFolderById(folderId).createFile(blob).setName(usn+".pdf");
    template.replaceAllText(name,"{{name}}");
  }
}

解决方法

答案

这里的主要问题是替换的文本没有更新,因此,您可以在实际操作时通过使用replaceAllText来复制幻灯片以填充必要的信息。然后保存并关闭它以刷新并应用更改。完成所有此过程后,即可即时生成新文件,并将其移至废纸directory目录。

代码

function myFunction() {
  var dataspreadsheet = "https://docs.google.com/spreadsheets/d/XXXX/edit"
  var slide = SlidesApp.getActivePresentation();
  var ss = SpreadsheetApp.openByUrl(dataspreadsheet);
  var sheet = ss.getSheetByName('Sheet1');
  var startRow = 2;
  var numRows = 3;
  var dataRange = sheet.getRange(startRow,1,numRows,3);
  var data = dataRange.getValues();
  var slides = slide.getSlides(); // You only need to get the slides once
  for (var i in data) {
    var row = data[i];
    var name = row[0]; // First column
    var usn = row[1]; //Second column

    /* Make a copy instead */
    var tmpSlide = SlidesApp.create(`tmp_presentation_${name}`);
    slide.getSlides().forEach(s => {
      tmpSlide.appendSlide(s);
    });
    var slidesTemplate = tmpSlide.getSlides();
    slidesTemplate[0].remove(); // Remove the first empty slide
    var template = slidesTemplate[1]; // Get the first slide of the copy without the empty slide
    template.replaceAllText("{{name}}",name);
    tmpSlide.saveAndClose(); // updates flushed and applied

    var presentationCopyId = tmpSlide.getId(); // Get the ID of the new copy
    var slideFile = DriveApp.getFileById(presentationCopyId);
    var blob = slideFile.getBlob();
    var folderId = "ZZZ"
    DriveApp.getFolderById(folderId).createFile(blob).setName(usn+".pdf");
    slideFile.setTrashed(true); // Then remove the slide previously created
  }
 }

参考

Slides: saveAndClose

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...