Существует ли setTitle (), аналогичный getTitle () элемента страницы? - PullRequest
0 голосов
/ 02 октября 2018

Как видно из названия, я ищу способ установить альтернативное название изображения в слайд-шоу.

В настоящее время это то, что я пробовал, но по некоторым причинам это не кажетсяобновить:

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

Возможно, стоит отметить, что скрипт работает в редакторе скриптов на странице Google.Переменные id, elementTitle и presentationId все определены ранее в скрипте, и я проверил их правильность.

Может кто-нибудь определить проблему с этим или предложить более простой способ сделать это?

Редактировать: Танайке помог мне сделать эту специфическую часть сценария работающей, но она не работает на более широкой картине, поэтому это редактирование.

То, что должен делать сценарий, это в основном поиск/ заменить на все элементы изображения в слайд-шоу.

На основе ключей на листе в столбце A следует заменить URL-адрес изображения на соответствующий URL-адрес в столбце B. Затем сценарий циклически перебирает все элементы в слайд-шоу, находит изображения и затем циклически их перебирает.проверить, имеет ли какой-либо из заголовков «ключ» в качестве заголовка.URL-адрес изображения должен быть заменен URL-адресом в той же строке на листе.Эта часть скрипта протестирована и работает, но ключ удаляется из объекта при обновлении URL.Этого не должно происходить, так как позже изображение можно будет заменить снова.

По этой причине я попытался сохранить заголовок перед обновлением URL-адреса и вернуть его с помощью вышеупомянутого 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, но он просто не работает должным образом (я даже протестировал эту конкретную часть как отдельный скрипт, и он работал нормально.).

Второе редактирование:

Примеры:

Лист: 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

1 Ответ

0 голосов
/ 07 октября 2018

Я думаю, что ваш скрипт работает.Вы можете подтвердить обновленный результат на слайде.

Но если вы хотите получить заголовок и описание, используя сервисы Slides, такие как getTitle() и getDescription(), после того как заголовок и описание обновлены с использованием Slides API, кажется,что эти результаты не обновляются.Обновленные результаты не могут быть получены, даже если используется saveAndClose().А также, к сожалению, на данном этапе я не смог найти такие методы, как setTitle() и setDescription() в моей среде.Так как насчет этого обходного пути?В этом обходном пути заголовок и описание обновляются API-интерфейсом Slides, а те получают из API-интерфейса Slides.

Пример сценария:

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

Примечание:

  • Если вы используете этот сценарий, включите Slides API в Advanced Services и консоли API.

Ссылки:

Если я неправильно понимаю, что вы хотите, извините.

Редактировать:

  • Вы хотите заменить все изображения в слайдах.
  • В настоящее время необходимо выполнить поиск заголовка каждого изображения и заменить изображение из URL-адреса, используя заголовок.
  • Когда изображения заменяются,Вы не хотите менять заголовок (ключ) каждого изображения.

Если мое понимание верно, как насчет этой модификации?

Точки модификации:

  • Кажется, что когда изображение заменяется, заголовок изображения очищается.
    • Во избежание этого при замене изображения также ставится заголовок.В этой ситуации используется batchUpdate для Slides API.
  • С точки зрения стоимости процесса, сначала он создает тело запроса и запрашивает тело запроса.Таким образом, эта ситуация может быть достигнута только одним вызовом 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.Поэтому, если вы хотите заменить много изображений, если из-за этого возникает ошибка, пожалуйста, измените скрипт выше.
...