是否有类似于页面元素的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 调用的最大请求数。所以如果你要替换很多张图片,如果因此出现错误,请修改上面的脚本。