是否有类似于页面元素的getTitle() 的setTitle()?
Is there a setTitle() similar to getTitle() of a page element?
如标题所示,我正在寻找一种方法来设置幻灯片中图像的替代标题。
目前这是我尝试过的,但由于某种原因它似乎没有更新:
var resource = {"requests": [
{"updatePageElementAltText": {
"objectId": id,
"description": "",
"title": elementTitle
}
}]};
Slides.Presentations.batchUpdate(resource, presentationId);
可能值得注意的是,脚本在 google sheet 的脚本编辑器中是 运行。变量 id、elementTitle 和 presentationId 都已在脚本的前面定义,我已检查它们是否正确。
任何人都可以发现这个问题或建议更简单的方法吗?
编辑:Tanaike 帮助我使脚本的这个特定部分起作用,但它在更大的画面中不起作用,因此进行了编辑。
脚本应该做的,基本上是对幻灯片中的所有图像元素执行 find/replace。
基于 A 列中 sheet 中的键,它应该将 B 列中的图像 URL 替换为相应的 URL。脚本然后循环遍历 A 列中的所有元素幻灯片,找到图像,然后循环浏览它们以检查是否有任何标题具有 'key' 作为标题。然后图像 URL 应替换为 sheet 中同一行上的 URL。脚本的这一部分已经过测试并且可以工作,但是当更新 URL 时,密钥会从 object 中删除。这不应该发生,因为图像应该可以稍后再次替换。
出于这个原因,我尝试在更新 URL 之前保存标题,然后使用 above-mentioned batchUpdate 将其放回原处,但由于某种原因,它无法正常工作。
这是完整的脚本:
function imageReplacer() {
var newPresentationSlides = SlidesApp.openByUrl(myslidesurl).getSlides();
var imageTitles = SpreadsheetApp.openByUrl(mysheeturl).getRange("'Image Replace List'!A2:A").getValues();
var imageURLs = SpreadsheetApp.openByUrl(mysheeturl).getRange("'Image Replace List'!B2:B").getValues();
var presentationId = 'myslidesid';
for (y = 0; y < newPresentationSlides.length; y++) {
var pageElements = newPresentationSlides[y].getPageElements();
for (x = 0; x < pageElements.length; x++) {
for (a = 0; a < imageTitles.filter(String).length; a++) {
if (pageElements[x].getPageElementType() == "IMAGE") {
if(pageElements[x].asImage().getTitle() == imageTitles[a]) {
var elementTitle = pageElements[x].asImage().getTitle();
var id = pageElements[x].getObjectId();
pageElements[x].asImage().replace(imageURLs[a]);
var id = pageElements[x].getObjectId();
var resource = {"requests": [
{"updatePageElementAltText": {
"objectId": id,
"description": "Sample description",
"title": elementTitle
}
}]};
Slides.Presentations.batchUpdate(resource, presentationId);
}
}
}
}
}
}
如您所见,脚本的中间部分与 tanaike 建议的完全相同,但它无法正常工作(我什至将该特定部分作为 stand-alone 脚本进行了测试,并且工作正常。) .
第二次编辑:
示例:
Sheet: https://docs.google.com/spreadsheets/d/1npWyONio_seI3bRibFWxiqzHxLZ-ie2wbszgROkLduE/edit#gid=0
幻灯片:https://docs.google.com/presentation/d/1rfT7TLD-O7dBbwV5V3UbugN1OLOnBI2-CZN2GPnmANM/edit#slide=id.p
我认为您的脚本有效。您可以在幻灯片上确认更新结果。
但是,如果您想在使用幻灯片 API 更新标题和说明后使用 getTitle()
和 getDescription()
等幻灯片服务检索标题和说明,那么这些结果似乎没有更新。即使使用 saveAndClose()
也无法检索更新的结果。而且,不幸的是,在当前阶段,我无法在我的环境中找到像 setTitle()
和 setDescription()
这样的方法。那么这个解决方法怎么样?在此变通方法中,标题和说明由 Slides API 更新,并由 Slides API.
检索。
示例脚本:
var presentationId = "###"; // Please set this.
var objectId = "###"; // Please set this.
// Update title and description
var resource = {"requests": [
{"updatePageElementAltText": {
"objectId": objectId,
"description": "Sample description",
"title": "Sample title"
}
}]};
Slides.Presentations.batchUpdate(resource, presentationId);
// Retrieve updated title and description
var res = Slides.Presentations.get(presentationId);
var slides = res.slides;
for (var i = 0; i < slides.length; i++) {
var pe = slides[i].pageElements;
for (var j = 0; j < pe.length; j++) {
if (pe[j].objectId == objectId) {
Logger.log(pe[j].title)
Logger.log(pe[j].description)
break;
}
}
}
注:
- 如果您使用此脚本,请在高级 Google 服务和 API 控制台启用幻灯片 API。
参考文献:
如果我误解了你的意思,我很抱歉。
编辑:
- 您想替换幻灯片中的所有图片。
- 此时你想搜索每张图片的标题,并用标题替换来自URL的图片。
- 替换图像时,您不想更改每个图像的标题(键)。
如果我的理解是正确的,这个修改怎么样?
修改点:
- 好像替换图片的时候,图片的标题被清除了。
- 为了避免这种情况,在替换图片的时候,也会放上标题。针对这种情况,使用了Slides的batchUpdateAPI。
- 从处理成本的角度来看,首先,它创建请求body并请求请求body。这样,这种情况只需要一次API调用就可以实现。
修改后的脚本:
function imageReplacer() {
var spreadsheetId = "### spreadsheetId ###"; // Please modify this.
var sheetName = "Image Replace List";
var presentationId = "### presentationId ###"; // Please modify this.
var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
var values = sheet.getRange(2, 1, sheet.getLastRow(), 2).getValues().filter(function(e) {return e[0] && e[1]});
var s = SlidesApp.openById(presentationId);
var slides = s.getSlides();
var requests = slides.reduce(function(reqs, slide) {
var r = slide.getPageElements().reduce(function(ar, e) {
if (e.getPageElementType() == "IMAGE") {
var key = values.filter(function(v) {return v[0] == e.getTitle()});
if (key.length == 1) {
var id = e.getObjectId();
var rq = [
{"replaceImage":{"imageObjectId":id, "url": key[0][1]}},
{"updatePageElementAltText":{"objectId":id, "title": key[0][0]}}
];
Array.prototype.push.apply(ar, rq);
}
}
return ar;
}, []);
if (r.length > 0) Array.prototype.push.apply(reqs, r);
return reqs;
}, []);
Slides.Presentations.batchUpdate({requests: requests}, presentationId);
}
注:
- 我不确定一次 API 调用的最大请求数。所以如果你要替换很多张图片,如果因此出现错误,请修改上面的脚本。
如标题所示,我正在寻找一种方法来设置幻灯片中图像的替代标题。
目前这是我尝试过的,但由于某种原因它似乎没有更新:
var resource = {"requests": [
{"updatePageElementAltText": {
"objectId": id,
"description": "",
"title": elementTitle
}
}]};
Slides.Presentations.batchUpdate(resource, presentationId);
可能值得注意的是,脚本在 google sheet 的脚本编辑器中是 运行。变量 id、elementTitle 和 presentationId 都已在脚本的前面定义,我已检查它们是否正确。
任何人都可以发现这个问题或建议更简单的方法吗?
编辑:Tanaike 帮助我使脚本的这个特定部分起作用,但它在更大的画面中不起作用,因此进行了编辑。
脚本应该做的,基本上是对幻灯片中的所有图像元素执行 find/replace。
基于 A 列中 sheet 中的键,它应该将 B 列中的图像 URL 替换为相应的 URL。脚本然后循环遍历 A 列中的所有元素幻灯片,找到图像,然后循环浏览它们以检查是否有任何标题具有 'key' 作为标题。然后图像 URL 应替换为 sheet 中同一行上的 URL。脚本的这一部分已经过测试并且可以工作,但是当更新 URL 时,密钥会从 object 中删除。这不应该发生,因为图像应该可以稍后再次替换。
出于这个原因,我尝试在更新 URL 之前保存标题,然后使用 above-mentioned batchUpdate 将其放回原处,但由于某种原因,它无法正常工作。
这是完整的脚本:
function imageReplacer() {
var newPresentationSlides = SlidesApp.openByUrl(myslidesurl).getSlides();
var imageTitles = SpreadsheetApp.openByUrl(mysheeturl).getRange("'Image Replace List'!A2:A").getValues();
var imageURLs = SpreadsheetApp.openByUrl(mysheeturl).getRange("'Image Replace List'!B2:B").getValues();
var presentationId = 'myslidesid';
for (y = 0; y < newPresentationSlides.length; y++) {
var pageElements = newPresentationSlides[y].getPageElements();
for (x = 0; x < pageElements.length; x++) {
for (a = 0; a < imageTitles.filter(String).length; a++) {
if (pageElements[x].getPageElementType() == "IMAGE") {
if(pageElements[x].asImage().getTitle() == imageTitles[a]) {
var elementTitle = pageElements[x].asImage().getTitle();
var id = pageElements[x].getObjectId();
pageElements[x].asImage().replace(imageURLs[a]);
var id = pageElements[x].getObjectId();
var resource = {"requests": [
{"updatePageElementAltText": {
"objectId": id,
"description": "Sample description",
"title": elementTitle
}
}]};
Slides.Presentations.batchUpdate(resource, presentationId);
}
}
}
}
}
}
如您所见,脚本的中间部分与 tanaike 建议的完全相同,但它无法正常工作(我什至将该特定部分作为 stand-alone 脚本进行了测试,并且工作正常。) .
第二次编辑:
示例:
Sheet: https://docs.google.com/spreadsheets/d/1npWyONio_seI3bRibFWxiqzHxLZ-ie2wbszgROkLduE/edit#gid=0
幻灯片:https://docs.google.com/presentation/d/1rfT7TLD-O7dBbwV5V3UbugN1OLOnBI2-CZN2GPnmANM/edit#slide=id.p
我认为您的脚本有效。您可以在幻灯片上确认更新结果。
但是,如果您想在使用幻灯片 API 更新标题和说明后使用 getTitle()
和 getDescription()
等幻灯片服务检索标题和说明,那么这些结果似乎没有更新。即使使用 saveAndClose()
也无法检索更新的结果。而且,不幸的是,在当前阶段,我无法在我的环境中找到像 setTitle()
和 setDescription()
这样的方法。那么这个解决方法怎么样?在此变通方法中,标题和说明由 Slides API 更新,并由 Slides API.
示例脚本:
var presentationId = "###"; // Please set this.
var objectId = "###"; // Please set this.
// Update title and description
var resource = {"requests": [
{"updatePageElementAltText": {
"objectId": objectId,
"description": "Sample description",
"title": "Sample title"
}
}]};
Slides.Presentations.batchUpdate(resource, presentationId);
// Retrieve updated title and description
var res = Slides.Presentations.get(presentationId);
var slides = res.slides;
for (var i = 0; i < slides.length; i++) {
var pe = slides[i].pageElements;
for (var j = 0; j < pe.length; j++) {
if (pe[j].objectId == objectId) {
Logger.log(pe[j].title)
Logger.log(pe[j].description)
break;
}
}
}
注:
- 如果您使用此脚本,请在高级 Google 服务和 API 控制台启用幻灯片 API。
参考文献:
如果我误解了你的意思,我很抱歉。
编辑:
- 您想替换幻灯片中的所有图片。
- 此时你想搜索每张图片的标题,并用标题替换来自URL的图片。
- 替换图像时,您不想更改每个图像的标题(键)。
如果我的理解是正确的,这个修改怎么样?
修改点:
- 好像替换图片的时候,图片的标题被清除了。
- 为了避免这种情况,在替换图片的时候,也会放上标题。针对这种情况,使用了Slides的batchUpdateAPI。
- 从处理成本的角度来看,首先,它创建请求body并请求请求body。这样,这种情况只需要一次API调用就可以实现。
修改后的脚本:
function imageReplacer() {
var spreadsheetId = "### spreadsheetId ###"; // Please modify this.
var sheetName = "Image Replace List";
var presentationId = "### presentationId ###"; // Please modify this.
var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
var values = sheet.getRange(2, 1, sheet.getLastRow(), 2).getValues().filter(function(e) {return e[0] && e[1]});
var s = SlidesApp.openById(presentationId);
var slides = s.getSlides();
var requests = slides.reduce(function(reqs, slide) {
var r = slide.getPageElements().reduce(function(ar, e) {
if (e.getPageElementType() == "IMAGE") {
var key = values.filter(function(v) {return v[0] == e.getTitle()});
if (key.length == 1) {
var id = e.getObjectId();
var rq = [
{"replaceImage":{"imageObjectId":id, "url": key[0][1]}},
{"updatePageElementAltText":{"objectId":id, "title": key[0][0]}}
];
Array.prototype.push.apply(ar, rq);
}
}
return ar;
}, []);
if (r.length > 0) Array.prototype.push.apply(reqs, r);
return reqs;
}, []);
Slides.Presentations.batchUpdate({requests: requests}, presentationId);
}
注:
- 我不确定一次 API 调用的最大请求数。所以如果你要替换很多张图片,如果因此出现错误,请修改上面的脚本。