Как я могу использовать скрипт приложений для изменения количества слайдов, печатаемых на каждой странице

У меня есть электронная таблица, которая программно создает презентацию Google Slides с несколькими слайдами.

Я хочу использовать скрипт приложений для создания PDF-версии этих слайдов, но с несколькими слайдами на каждой странице.

Я знаю, как использовать DriveApp.create(blob), чтобы получить версию моих слайдов в формате pdf, но это делает только один слайд на страницу.

Я также знаю, что могу получить доступ к настройкам «Параметры печати и предварительный просмотр» в Слайдах, чтобы выполнить эту функцию вручную.

Можно ли каким-то образом достичь этой цели исключительно с помощью скрипта?

С уважением,

Бретт

РЕДАКТИРОВАТЬ: Для ясности я прилагаю изображение того, что хочу. Я знаю, что это возможно с помощью Slides Ui. Я хочу знать, можно ли использовать скрипт приложений. Файл изображения, представляющий экспорт PDF-файла слайдов, где на каждой странице показано по 6 слайдов.


person BJG87    schedule 10.12.2018    source источник
comment
Например, как насчет этого потока? 1. Создайте новые Google Slides со слайдами, которые вы хотите преобразовать в данные PDF в качестве временного файла. 2. Экспортируйте созданные слайды как файл PDF. 3. Удалите временный файл. Если это было не то, что вам нужно, извините.   -  person Tanaike    schedule 11.12.2018
comment
Да, я использую этот метод постоянно, но как мне экспортировать слайды в формате PDF с несколькими слайдами на каждой странице? Ваш метод позволяет мне экспортировать в PDF только по одному слайду на каждой странице.   -  person BJG87    schedule 11.12.2018
comment
Вы хотите добавить несколько эскизов слайдов на одну страницу слайдов и экспортировать ее как файл PDF. Из ваших ответов и обновлений я понял вот что. Я правильно понимаю?   -  person Tanaike    schedule 12.12.2018
comment
Да, это правильно. Этот параметр доступен вручную через настройки печати и меню предварительного просмотра в слайдах.   -  person BJG87    schedule 13.12.2018
comment
Спасибо за ответ. Я опубликовал обходной путь в качестве ответа. Не могли бы вы это подтвердить? В моем окружении я мог подтвердить, что сценарий работает нормально. Но если это не сработало, мне очень жаль.   -  person Tanaike    schedule 14.12.2018
comment
Я обновил свой ответ, потому что нашел способ получения эскизов с каждого слайда. Не могли бы вы это подтвердить. Оба сценария могут получить одинаковый результат. Поэтому выберите один из них. Если я неправильно понял ваш вопрос, сообщите мне. Я бы хотел его изменить.   -  person Tanaike    schedule 15.12.2018


Ответы (1)


  • Вы хотите суммировать 6 слайдов на одном слайде и экспортировать слайды в виде файла PDF.
  • Каждый слайд из 6 слайдов является изображением каждого слайда.

Если я правильно понимаю, как насчет этого обходного пути? К сожалению, на текущем этапе кажется, что нет методов для прямого достижения вышеуказанного в сервисе SlidesApp и Slides API. Я не мог найти таких методов. Поэтому необходимо подумать об обходном пути. Я поставил перед собой задачу добиться этого, потому что думал, что достижение этого также полезно для меня и других пользователей.

Последовательность этого обходного пути выглядит следующим образом.

Поток:

  1. Скопируйте исходный файл слайдов как временный файл.
  2. Retrieve images of all slides.
    • When the Slides file is exported to PNG file, the top page is exported as PNG file. I used this.
  3. Put and arrange the retrieved images to the temporary file.
    • When the image is inserted to a slide, retrieve the size and change the size, then put the image to the calculated position.
  4. Экспортируйте слайды в файл PDF.
  5. Delete the temporary file.
    • In this case, the temporary file is put in the trash box.

Пример сценария:

Скопируйте и вставьте этот сценарий в редактор сценариев. И, пожалуйста, установите идентификатор файла исходных слайдов. В этом примере сценария col и row равны 3 и 2 соответственно. То же самое и с вашим вопросом. Если вы измените размер изображений и разделение, измените wsize и sep. wsize - ширина изображения. Когда это установлено, высота рассчитывается.

function myFunction() {
  // Please set these parameters
  var id = "### file ID ###"; // file ID of original Slides
  var col = 3; // Number of columns
  var row = 2; // Number of rows
  var wsize = 200; // Size of width of each image (pixels)
  var sep = 5; // Space of each image (pexels)


  // Create temporary file
  var originalFile = DriveApp.getFileById(id);
  var tempFile = originalFile.makeCopy();
  var idt = tempFile.getId();

  // Retrieve slides as images
  var s = SlidesApp.openById(idt);
  var slides = s.getSlides();
  var accessToken = ScriptApp.getOAuthToken();
  var baseUrl = "https://docs.google.com/presentation/d/" + idt + "/export/";
  var url = baseUrl + "png?access_token=" + accessToken;
  var blobs = slides.map(function(e) {
    var blob = UrlFetchApp.fetch(url).getBlob();
    slides[0].remove();
    s.saveAndClose();
    s = SlidesApp.openById(idt);
    slides = s.getSlides();
    return blob;
  });

  // Put images 
  var ph = s.getPageHeight();
  var pw = s.getPageWidth();
  var leftOffset = (pw - ((wsize * col) + (sep * (col - 1)))) / 2;
  if (leftOffset < 0) throw new Error("Images are sticking out from a slide.");
  var len = col * row;
  var loops = Math.ceil(blobs.length / (col * row));
  for (var loop = 0; loop < loops; loop++) {
    var ns = s.insertSlide(loop);
    var topOffset, top;
    var left = leftOffset;
    for (var i = len * loop; i < len + (len * loop); i++) {
      if (i === blobs.length) break;
      var image = ns.insertImage(blobs[i]);
      var w = image.getWidth();
      var h = image.getHeight();
      var hsize = h * wsize / w;
      if (i === 0 || i % len === 0) {
        topOffset = (ph - ((hsize * row) + sep)) / 2;
        if (topOffset < 0) throw new Error("Images are sticking out from a slide.");
        top = topOffset;
      }
      image.setWidth(wsize).setHeight(hsize).setTop(top).setLeft(left).getObjectId();
      if (i === col - 1 + (loop * len)) {
        top = topOffset + hsize + sep;
        left = leftOffset;
      } else {
        left += wsize + sep;
      }
    }
  }
  s.saveAndClose();

  // Export PDF file
  var urlPdf = baseUrl + "pdf?access_token=" + accessToken;
  var pdf = UrlFetchApp.fetch(urlPdf).getBlob();
  DriveApp.createFile(pdf.setName(originalFile.getName() + ".pdf"));
  tempFile.setTrashed(true);
}

Вход:

Это оригинальные слайды. Этот образец слайда состоит из 15 слайдов.

введите здесь описание изображения

Выход:

Это экспортированный файл PDF.

введите здесь описание изображения

Использованная литература:

Редактировать:

Я нашел Presentations.pages.getThumbnail в Slides API . Поэтому я также подготовил пример сценария, используя его.

При использовании этого скрипта включите Slides API в консоли API.

Пример сценария:

function myFunction() {
  // Please set these parameters
  var id = "### file ID ###"; // file ID of original Slides
  var col = 3; // Number of columns
  var row = 2; // Number of rows
  var wsize = 200; // Size of width of each image (pixels)
  var sep = 5; // Space of each image (pexels)


  // Retrieve slides as images
  var originalFile = SlidesApp.openById(id);
  var accessToken = ScriptApp.getOAuthToken();
  var pageObjectIds = originalFile.getSlides().map(function(e) {return e.getObjectId()});
  var reqUrls = pageObjectIds.map(function(pageObjectId) {
    return {
      method: "get",
      url: "https://slides.googleapis.com/v1/presentations/" + id + "/pages/" + pageObjectId + "/thumbnail?access_token=" + accessToken,
    };
  });
  var reqBlobs = UrlFetchApp.fetchAll(reqUrls).map(function(e) {
    var r = JSON.parse(e);
    return {
      method: "get",
      url: r.contentUrl,
    };
  });
  var blobs = UrlFetchApp.fetchAll(reqBlobs).map(function(e) {return e.getBlob()});

  // Create a temporary Slides and put images 
  var s = SlidesApp.create("temporarySlides");
  s.getSlides()[0].remove();
  var idt = s.getId();
  var ph = s.getPageHeight();
  var pw = s.getPageWidth();
  var leftOffset = (pw - ((wsize * col) + (sep * (col - 1)))) / 2;
  if (leftOffset < 0) throw new Error("Images are sticking out from a slide.");
  var len = col * row;
  var loops = Math.ceil(blobs.length / (col * row));
  for (var loop = 0; loop < loops; loop++) {
    var ns = s.insertSlide(loop);
    var topOffset, top;
    var left = leftOffset;
    for (var i = len * loop; i < len + (len * loop); i++) {
      if (i === blobs.length) break;
      var image = ns.insertImage(blobs[i]);
      var w = image.getWidth();
      var h = image.getHeight();
      var hsize = h * wsize / w;
      if (i === 0 || i % len === 0) {
        topOffset = (ph - ((hsize * row) + sep)) / 2;
        if (topOffset < 0) throw new Error("Images are sticking out from a slide.");
        top = topOffset;
      }
      image.setWidth(wsize).setHeight(hsize).setTop(top).setLeft(left).getObjectId();
      if (i === col - 1 + (loop * len)) {
        top = topOffset + hsize + sep;
        left = leftOffset;
      } else {
        left += wsize + sep;
      }
    }
  }
  s.saveAndClose();

  // Export PDF file
  var urlPdf = "https://docs.google.com/presentation/d/" + idt + "/export/" + "pdf?access_token=" + accessToken;
  var pdf = UrlFetchApp.fetch(urlPdf).getBlob();
  DriveApp.createFile(pdf.setName(originalFile.getName() + ".pdf"));
  DriveApp.getFileById(idt).setTrashed(true);
}

Примечание:

  • Оба сценария могут получить одинаковый результат. Поэтому выберите один из них. Я думаю, что второй может быть немного быстрым, потому что все миниатюрные изображения извлекаются с помощью fetchAll.
person Tanaike    schedule 14.12.2018