如何使用 Google 脚本从本地 Google 驱动器中的图像文件夹创建 Google 幻灯片演示文稿?

How do I create a Google Slides presentation from a folder of images in a local Google Drive using Google Script?

我想在 Google 脚本中从本地 Google 驱动器上的图像文件夹中创建一个 Google 幻灯片演示文稿。我想给每个人单独贴上标签,以便在演示文稿中给他们一个特定的顺序,并附加一个布尔值供以后使用。

我首先尝试改编 Google 开发人员视频中的示例代码: https://www.youtube.com/watch?v=rTDz-Zcn7yk.

这行得通,但他只是暗示能够显示来自个人 Google 驱动器的图像,而没有解释如何操作。

然后我尝试将 Google 开发人员的代码与 Learn Google 电子表格视频创建的代码相结合:https://www.youtube.com/watch?v=PTOKHjVkXYs.

在这里,他正尝试使用来自包含图像的本地 Google 驱动器文件夹中的信息创建电子表格。这让我更接近答案,但我 运行 在尝试将文件夹的图像传递到数组并通过 .insertImage();

传递它们时遇到了类似的麻烦

这是我试图通过结合这两者来创建的代码。我假设我没有从我的 getMyFiles 函数中检索正确的数据并将它们复制到我的 AfileLabels 数组中。也许它应该使用 .get 而不是 .getName,它可以 return 来自本地驱动器的 imageUrl,但我不知道该怎么做。我似乎也无法将该数组传递到我的最后一行:images.forEach(addImageSlide);。我也确信有一种创建 fileLabel 数组的方法比像我那样迭代创建它们要简单得多,但我不知道该怎么做。

var NAME = "My Presentation";
var deck = SlidesApp.create(NAME);

function getMyFiles() {
     var myFolders = DriveApp;
     var i = 0;
     var j = 0;
     var AfileLabels = new Array();          
         var AfileLabels = [];
     var BfileLabels = new Array();
         var BfileLabels = [];

     var AfolderIter = myFolders.getFoldersByName("A");
     var Afolder = AfolderIter.next();
     var AfolderIter = Afolder.getFiles();
     while(AfolderIter.hasNext()) {         
        var Afile = AfolderIter.next();       
        var AfileName = Afile.getName();       
        Logger.log(AfileName);
        AfileLabels[i] = AfileName;
        i++;
     }
        var i = 0;
        Logger.log(AfileLabels);

     var BfolderIter = myFolders.getFoldersByName("B");
     var Bfolder = BfolderIter.next(); 
     var BfolderIter = Bfolder.getFiles();
     while(BfolderIter.hasNext()) {
        var Bfile = BfolderIter.next();
        var BfileName = Bfile.getName();
        Logger.log(BfileName);
        BfileLabels[i] = BfileName;
        j++;
     }
        var j = 0;
        Logger.log(BfileLabels);     
}

    function addImageSlide(AfileLabels, index) {
      var slide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK);
      var image = slide.insertImage(AfileLabels);
      var imgWidth = image.getWidth();
      var imgHeight = image.getHeight();
      var pageWidth = presentation.getPageWidth();
      var pageHeight = presentation.getPageHeight();
      var newX = pageWidth/2. - imgWidth/2.;
      var newY = pageHeight/2. - imgHeight/2.;
      image.setLeft(newX).setTop(newY);
    }

function main() { 
       var AfileLabels = new Array();     
       var AfileLabels = [];  
       var AfileLabels = getMyFiles();
       Logger.log(AfileLabels);
  var images = ASfileLabels;
  var [title, subtitle] = deck.getSlides()[0].getPageElements();  
  title.asShape().getText().setText(NAME);         
  subtitle.asShape().getText().setText("Subtitle for Presentation"); 
  images.forEach(addImageSlide); 
}

我用错了什么功能?如何将我的图像数组传递给图像?

有些地方需要改进

最重要的:

  • 在检索到您感兴趣的文件夹中的所有文件后 - 您检索文件名并尝试将它们粘贴到演示文稿中 - 相反,您应该在 [=11 内按文件名(或更好地按 ID)检索文件=]
  • 名称有些不一致,因为您将多个函数修补在一起,例如deckpresentation
  • 有些循环定义不正确
  • 此外,您不需要 while 循环中的计数器
  • 看看下面的工作版本
  • 请记住,这个版本可以缩短和优化
var NAME = "My Presentation";
var deck = SlidesApp.create("NAME");
var presentation = deck;  

function getMyFiles() {

  var labels = [];  
  var myFolders = DriveApp;
  var AfolderIter = myFolders.getFoldersByName("A");
  var Afolder = AfolderIter.next();
  var AfolderIter = Afolder.getFiles();
  while(AfolderIter.hasNext()) {         
    var Afile = AfolderIter.next();       
    var AfileId = Afile.getId();       
    labels.push(AfileId);
  }
  var BfolderIter = myFolders.getFoldersByName("B");
  var Bfolder = BfolderIter.next(); 
  var BfolderIter = Bfolder.getFiles();
  while(BfolderIter.hasNext()) {
    var Bfile = BfolderIter.next();
    var BfileId = Bfile.getId();
    labels.push(BfileId);
  } 
  Logger.log(labels);
  return labels;
}

function addImageSlide(fileId) {
  var slide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var image = slide.insertImage(DriveApp.getFileById(fileId));
  var imgWidth = image.getWidth();
  var imgHeight = image.getHeight();
  var pageWidth = presentation.getPageWidth();
  var pageHeight = presentation.getPageHeight();
  var newX = pageWidth/2. - imgWidth/2.;
  var newY = pageHeight/2. - imgHeight/2.;
  image.setLeft(newX).setTop(newY);
}

function main() { 
  var fileIds = getMyFiles();
  Logger.log(fileIds);
  var [title, subtitle] = deck.getSlides()[0].getPageElements();  
  title.asShape().getText().setText(NAME);         
  subtitle.asShape().getText().setText("Subtitle for Presentation"); 
  for(var i = 0; i< fileIds.length; i++){
    addImageSlide(fileIds[i]); 
  }
}