Скрипт Google Apps, отображение шаблона только в сохраненном pdf

При просмотре сохраненных файлов PDF имя не меняется на соответствующее имя на листе. Есть идеи, почему? Я думаю, это как-то связано с async / await.

Имя и 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}}");
  }
}

person Raghav Maheshwari    schedule 05.09.2020    source источник


Ответы (1)


Отвечать

Основная проблема здесь в том, что заменяемый текст не обновляется, по этой причине вы можете сделать копию своего слайда, заполнив необходимую информацию, с помощью replaceAllText, как вы это делаете на самом деле. Затем сохраните и закройте его, чтобы очистить и применить изменения. После всей этой процедуры получите новые файлы, созданные на лету, и переместите их в корзину.

Код

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
  }
 }

Ссылка

Слайды: saveAndClose

person Jose Vasquez    schedule 07.09.2020