Как создать презентацию Google Slides из папки изображений на локальном диске Google, используя Google Script? - PullRequest
0 голосов
/ 24 апреля 2020

Я хотел бы создать презентацию Google Slides из папки с изображениями на моем локальном диске Google в рамках скрипта Google. Я хочу пометить каждый из них по отдельности, чтобы дать им определенный порядок в презентации и прикрепить логическое значение для последующего использования.

Сначала я попытался адаптировать код из примера в видео Google Developers: https://www.youtube.com/watch?v=rTDz-Zcn7yk.

Это работает, но он просто намекает на возможность показа изображений с личного диска Google без объяснения того, как.

Затем я попытался объединить код разработчика Google с кодом, созданным видео Learn Google Spreadsheets: https://www.youtube.com/watch?v=PTOKHjVkXYs.

Здесь он пытается создать электронную таблицу с информацией. из локальной папки Google drive, содержащей изображения. Это приблизило меня к ответу, но я столкнулся с подобной проблемой, пытаясь передать изображения папки в массив и передать их через .insertImage ();

Вот код, который я пытался создать, пытаясь объединить эти двое. Я предполагаю, что не получаю правильные данные из моей функции getMyFiles и не копирую их в мой массив AfileLabels. Возможно, вместо .getName следует использовать .get, который может вернуть 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); 
}

Какие функции я использую неправильно ? Как передать массив изображений в изображения?

1 Ответ

0 голосов
/ 24 апреля 2020

Есть некоторые вещи, которые нужно улучшить

Наиболее важные:

  • После того, как вы извлечете все файлы в интересующих вас папках - вы извлекаете имена файлов и пытаетесь вставьте их в презентацию - вместо этого вы должны извлекать файлы по их именам (или, лучше, по Id) в пределах addImageSlides()
  • Существуют некоторые несоответствия с именами, поскольку вы исправили несколько функций вместе, например, deck и presentation
  • Есть несколько неправильно определенных циклов
  • Кроме того, вам не нужны счетчики внутри 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]); 
  }
}
...