Is there a setTitle() similar to getTitle() of a page element?

时间:2018-10-02 09:16:08

标签: google-apps-script google-slides-api

As the title suggests, I'm looking for a way to set the alt title of an image in a slideshow.

Currently this is what i have tried, but for some reason it doesn't seem to update:

var resource = {"requests": [
          {"updatePageElementAltText": {
            "objectId": id,
            "description": "",
            "title": elementTitle
          }
          }]};
Slides.Presentations.batchUpdate(resource, presentationId);

It might be worth noting that the script is running in the Script Editor of a google sheet. The variables id, elementTitle and presentationId are all defined earlier in the script and I've checked that they are correct.

Can anyone spot the issue with this or suggest an easier way to do it?

Edit: Tanaike helped me make this specific part of the script work, but it isn't working in the larger picture, hence this edit.

What the script is supposed to do, is basically do a find/replace on all Image elements in the slideshow.

Based on keys in a sheet in Column A it should replace the Image URL in with the corresponding URL in column B. The script then cycles through all elements in the slideshow, finds the images, and then cycles through them to check if any of the titles have the 'key' as the title. The image URL should then be replaced with the URL on the same row in sheet. This part of the script is tested and works, but the key is removed from the object when the URL is updated. This shouldn't be happening as the Image should be able to be replaced again later.

For this reason, I tried to save the title before updating the URL and the put it back with the above-mentioned batchUpdate, but for some reason, it isn't working properly.

Here is the full script:

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);
          }
        }
      }  
    }
  }
}

As you can see the middle part of the script is exactly the same as tanaike suggested, but it's just not working properly (I even tested that specific part as a stand-alone script and it worked fine.).

Second edit:

Examples:

Sheet: https://docs.google.com/spreadsheets/d/1npWyONio_seI3bRibFWxiqzHxLZ-ie2wbszgROkLduE/edit#gid=0

Slides: https://docs.google.com/presentation/d/1rfT7TLD-O7dBbwV5V3UbugN1OLOnBI2-CZN2GPnmANM/edit#slide=id.p

1 个答案:

答案 0 :(得分:1)

我认为您的脚本有效。您可以在幻灯片上确认更新的结果。

但是,如果要在使用Slides API更新标题和描述之后使用getTitle()getDescription()之类的Slides服务检索标题和描述,则这些结果似乎没有更新。即使使用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控制台中启用Slides API。

参考文献:

如果我误解了你想要什么,对不起。

编辑:

  • 您要替换幻灯片中的所有图像。
  • 这时,您要搜索每个图像的标题,并使用标题替换URL中的图像。
  • 替换图像时,您不想更改每个图像的标题(键)。

如果我的理解是正确的,那么该修改如何?

修改点:

  • 似乎替换图像时,图像的标题被清除了。
    • 为了避免这种情况,在替换图像时,还会放置标题。在这种情况下,将使用Slides API的batchUpdate。
  • 从处理成本的角度出发,首先创建请求主体并请求请求主体。这样,仅通过一个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调用的最大请求数。因此,如果您要替换很多图像,如果发生此错误,请修改上面的脚本。