如何使用 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)检索文件=]
- 名称有些不一致,因为您将多个函数修补在一起,例如
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]);
}
}
我想在 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)检索文件=]
- 名称有些不一致,因为您将多个函数修补在一起,例如
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]);
}
}