【问题标题】:Copying Multiple Slides from a Master Slide Desk using Google Apps Script使用 Google Apps 脚本从 Master Slide Desk 复制多张幻灯片
【发布时间】:2020-02-12 20:53:32
【问题描述】:

我创建了一个代码来替换谷歌幻灯片上的占位符。这个项目的起点是一个谷歌表单。一旦提交了谷歌表单 - 然后谷歌表单的相关数据将输入谷歌幻灯片模板。请参见下面的代码。我希望在表单上创建一个问题,人们可以在其中选择要包含的多张幻灯片(例如 2 张证书幻灯片,共 10 张)

function PoD() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("A-PoD").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow()

  for (var i =2;i<lr;i++){

    if(ss.getRange(i, 1).getValue()){

  //Make a copy of the template file
  var documentId = DriveApp.getFileById('1REHMrl6kfzXbgSipvBDkNitkfsM8tJsUSAICggxNsHw').makeCopy().getId();

  var Name_of_programme = ss.getRange(i, 2).getValue();

  DriveApp.getFileById(documentId).setName("PwC's Academy_"+Name_of_client+"_"+Name_of_programme+"_"+Month);

  var FileName = Name_of_programme;

  //Get the document body as a variable
  var body = SlidesApp.openById(documentId);

  body.replaceAllText('{Name of programme}', Name_of_programme);


  var lastSlide = body.getSlides();
  lastSlide[5].remove();

我希望继续编写脚本以包含选择多张幻灯片的功能。我看到下面的脚本来复制一张幻灯片,但无法弄清楚如何轻松复制多张幻灯片。

var srcPresentationId = "### source fileId ###";
var copysrcSlideIndex = 0; // 0 means page 1.

var copydstSlideIndex = 0; // 0 means page 1.

var src = SlidesApp.openById(srcPresentationId).getSlides()[copysrcSlideIndex];
SlidesApp.getActivePresentation().insertSlide(copydstSlideIndex, src);

我想让人们选择将哪些幻灯片包含在 Google 表单中作为多项选择。

在脚本的后端,我是否需要将幻灯片的名称与幻灯片编号进行映射?或者可以在每张幻灯片的文本框中包含唯一的参考,然后选择相关的幻灯片?在这里大声思考。任何指导将不胜感激。

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。我认为这几张幻灯片可以复制到其他 Google 幻灯片。但是从At the back end of the script, would I need to map the names of the slides with slide numbers? or can have include a unique reference in a text box on each slide and then select the relevant slide?,我无法理解你的目标。我能问一下你的目标和当前的问题吗?
  • @Tanaike 感谢您的回复。我的目标是将多张幻灯片从母版幻灯片复制到复制的模板。我想在谷歌表格上控制它,这就是为什么我问我如何才能做到这一点。
  • 感谢您的回复。我可以理解copy multiple slides from a master slide deck to a copied template。关于I would like to control this on a google sheet,当我能正确理解你的目标并清楚地看到它的愿景时,我会想办法。
  • 例如,我在 Master deck 上有 10 张幻灯片。我将有一个谷歌表单,让人们可以选择他们想要包含的幻灯片。提交表单后,我有一个在后台运行的应用程序脚本。表单的响应链接到执行 appscript 的 google 表格。
  • 所以基本上我希望根据谷歌表单中记录在谷歌表格上的回复复制多张幻灯片。如果我知道如何同时复制多张纸,那么我可以对表单进行逆向工程,以确保幻灯片参考与主幻灯片相匹配。

标签: javascript google-apps-script google-sheets google-slides-api google-slides


【解决方案1】:
  • 您希望将主 Google 幻灯片中的 5、7 和 9 页(索引为 4、6 和 8)复制到其他 Google 幻灯片。
  • 您希望使用 Google Apps 脚本实现此目的。

我可以像上面那样理解。如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

流程:

  1. 从主 Google 幻灯片中检索所有幻灯片。
  2. 将所需幻灯片复制到循环中的目标 Google 幻灯片。

模式一:

示例脚本:

在运行脚本之前,请设置变量。

function myFunction() {
  var copyPageNumbers = [5, 7, 9];  // Please set the page number. This is not the index. So the 1st page is 1.
  var masterGoogleSlidesId = "###";  // Please set the master Google Slides ID.
  var destinationGoogleSlidesId = "###";  // Please set the destination Google Slides ID.
  var offset = 1;

  var src = SlidesApp.openById(masterGoogleSlidesId);
  var dst = SlidesApp.openById(destinationGoogleSlidesId);
  var slides = src.getSlides();
  var page = 0;
  slides.forEach(function(slide, i) {
    if (copyPageNumbers.indexOf(i + 1) != -1) {
      dst.insertSlide(offset + page, slide);
      page++;
    }
  });
}

模式 2:

示例脚本:

function myFunction() {
  var copyPageNumbers = [5, 7, 9];  // Please set the page number. This is not the index. So the 1st page is 1.
  var masterGoogleSlidesId = "###";  // Please set the master Google Slides ID.
  var destinationGoogleSlidesId = "###";  // Please set the destination Google Slides ID.
  var offset = 1;

  var src = SlidesApp.openById(masterGoogleSlidesId);
  var dst = SlidesApp.openById(destinationGoogleSlidesId);
  var slides = src.getSlides();
  copyPageNumbers.forEach(function(p, i) {
    dst.insertSlide(offset + i, slides[p - 1]);
  });
}

注意:

  • 在这两种模式中,主 Google 幻灯片的第 5、7 和 9 页都是从目标 Google 幻灯片的第 2 页复制的。
    • 使用 var offset = 0 时,主 Google 幻灯片的第 5、7 和 9 页将从目标 Google 幻灯片的第 1 页复制。

参考:

【讨论】:

  • @Mohammed Mishal 感谢您的回复。很高兴您的问题得到解决。
  • 如果幻灯片重新排序,则索引会更改。使用标题更安全。
  • @aNewb 感谢您的评论。但我必须为我糟糕的英语水平道歉。 if slides are reordered the index changes. using title is safer.我看不懂,可以问一下具体情况吗?
  • 我的错误是考虑幻灯片上的元素而不是幻灯片本身。
  • "在创建时指定对象 ID 在创建页面或页面元素时使用...它可能会改变。有关详细信息,请参阅以下部分。 developers.google.com/slides/how-tos/…这听起来像是包含页面和元素????
【解决方案2】:

感谢@Tanaike,提供解决方案!

以您的代码为基础,我能够构建一个脚本来将幻灯片添加到单个文件夹中的多个幻灯片组。我想分享给可能需要的人。下面的代码...

function copySlides() {
  // Array of slide numbers to grab [1, 2, 3,...]
  var copyPageNumbers = [1];  // Please set the page number. This is not the index. So the 1st page is 1.
  // Which deck contains the slides to copy
  var masterGoogleSlidesId = '###';  // Please set the master Google Slides ID.

  // Folder containing Slides to copy to
  var folderID = '###';
  var folderToCopyTo = DriveApp.getFolderById(folderID);

  // Slide files in folder
  var slidesInFolder = folderToCopyTo.getFilesByType(MimeType.GOOGLE_SLIDES);

  var counter = 0;
  var total = 0;

  while (slidesInFolder.hasNext()) {

    var file = slidesInFolder.next();

    var destinationGoogleSlidesId = file.getId();  // Please set the destination Google Slides ID.
    var offset = 0;

    try {
      var src = SlidesApp.openById(masterGoogleSlidesId);
      var dst = SlidesApp.openById(destinationGoogleSlidesId);
      var slides = src.getSlides();
       copyPageNumbers.forEach(function (p, i) {
         dst.insertSlide(offset + i, slides[p - 1]);
       });
      counter++;
    }
    catch (e) {
      console.log(destinationGoogleSlidesId);
      console.log(e);
    }

    total++;

  }

  console.log(counter + ' of ' + total + ' Slide Decks Updated');

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多