我的目标是根据文件夹中的图片自动创建和更新Google幻灯片演示文稿:
当前工作流程正常工作但我想自动化的工作流程如下:
我努力实现的目标:
不是创建幻灯片并逐个使用文件选择器插入图像,而是使用基于驱动器文件夹中的图像文件创建演示文稿的脚本。
我使用了Tutorial on the Google Developers Pages并且幻灯片的创建工作正常。但是,与手动插入相反,脚本创建的幻灯片中的图像不会更新。该脚本只提取一次图像,并且似乎使用了图像的副本"。
我的测试代码是:
var NAME = "Dynamic Image Insert Test";
var presentation = SlidesApp.create(NAME);
function addImageSlide(fileID, index) {
var slide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK);
var imageurl = DriveApp.getFileById(fileID);
var image = slide.insertImage(imageurl);
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 images = [
"Insert ID of a File 1 on Google Drive here",
"Insert ID of a File 2 on Google Drive here"
];
var [title, subtitle] = presentation.getSlides()[0].getPageElements();
title.asShape().getText().setText(NAME);
subtitle.asShape().getText().setText("Insert Files from Drive using File ID");
images.forEach(addImageSlide);
}
此外,在检查幻灯片页面的对象属性时,似乎有2个参数: contentUrl和sourceUrl :
使用文件选择器插入时,图像似乎使用 sourceUrl ,它保持不变,这样在Drive上更新文件时更新图像。当使用AppScript(或使用API - 也测试过)时,Image似乎使用了contentUrl,每次创建图像时都会生成,因此不会引用驱动器上的文件,因此不会反映对文件的任何更改。驱动器。
页面对象属性的记录器输出:
{
"pageElements": [
{
"transform": {
"scaleX": 171.123,
"scaleY": 171.123,
"unit": "EMU",
"translateY": 1288327.54,
"translateX": 2375975
},
"objectId": "MyImage_01",
"image": {
"sourceUrl": "https://lh3.google.com/u/0/d/This-is-the-static-file-id",
"contentUrl": "https://lh6.googleusercontent.com/This-is-the-id-created-when-creating-the-image-on-the-slide",
"imageProperties": {
"shadow": {
"color": {
"rgbColor": {}
},
"blurRadius": {
"unit": "EMU"
},
"type": "OUTER",
"transform": {
"scaleX": 1,
"scaleY": 1,
"unit": "EMU"
},
"alpha": 1,
"propertyState": "NOT_RENDERED",
"rotateWithShape": false,
"alignment": "BOTTOM_LEFT"
},
"outline": {
"dashStyle": "SOLID",
"propertyState": "NOT_RENDERED",
"weight": {
"unit": "EMU",
"magnitude": 9525
},
"outlineFill": {
"solidFill": {
"color": {
"themeColor": "DARK2"
},
"alpha": 1
}
}
}
}
},
"size": {
"width": {
"unit": "EMU",
"magnitude": 23375
},
"height": {
"unit": "EMU",
"magnitude": 15000
}
}
}
]
}
reference of the API中未记录sourceUrl。
任何想法如何在插入幻灯片时使用 sourceUrl 而不是contentUrl?如何使用Google应用程序脚本复制与文件选择器相同的Insert语句和文件引用?
答案 0 :(得分:0)
我已使用此脚本更新一张幻灯片上的所有图像。我目前正在寻找当用户通过Google表单加载图像时自动执行此功能的方法。也许这可以帮助您解决问题。
/////////////////////////////////////////
var deck = SlidesApp.getActivePresentation()
var slide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK)
function main() {
var folder = DriveApp.getFolderById('your folder id goes here'); // Change the folder
ID here
var files = folder.getFiles();
while (files.hasNext()) {
var file = files.next();
Logger.log(file.getName());
var imageUrl = DriveApp.getFileById(file.getId()).getDownloadUrl() + "&access_token="
+ ScriptApp.getOAuthToken();
Logger.log(DriveApp.getFileById(file.getId()).getDownloadUrl() + "&access_token=" +
ScriptApp.getOAuthToken());
var image = slide.insertImage(imageUrl);
}}
////////////////////////////////////
问候 卢克
答案 1 :(得分:0)
所以我要做的另一件事是使用“ .replace”将blob替换为新的URL。
function rePlace(){
var IdBox = SlidesApp.getActivePresentation().getSlides()[0].getImages();
//var L_nk = IdBox[1].
IdBox[1].select();
var userProperties = PropertiesService.getUserProperties();
var loopCounter = Number(userProperties.getProperty('loopCounter'));
IdBox[1].replace("your URL")
}
答案 2 :(得分:0)
我发现(在Python中)基于SAME source_url更新content_url的唯一方法是在驱动器中更新源映像,该方法是使用access_token重新生成source_url
img_url = '%s&access_token=%s' % (
DRIVE.files().get_media(fileId=rsp['id']).uri, creds.access_token)
(http://wescpy.blogspot.com/search/label/API)
阅读博客以获取更多详细信息。
一旦您成功获取了新网址,就可以使用替换图片请求对其进行更新
https://developers.google.com/slides/reference/rest/v1/presentations/request#ReplaceImageRequest