Есть ли setTitle (), похожий на getTitle () элемента страницы?

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

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

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


person Jonas Bæk    schedule 02.10.2018    source источник
comment
Мой ответ показал вам результат, которого вы хотите? Не могли бы вы рассказать мне об этом? Мне тоже полезно учиться. Если это сработает, другие люди, у которых есть такая же проблема с вами, также могут основать ваш вопрос как вопрос, который можно решить. Если у вас еще есть проблемы с моим ответом, не стесняйтесь сообщить мне об этом. Хочу учиться решать ваши вопросы.   -  person Tanaike    schedule 12.10.2018


Ответы (1)


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

Но если вы хотите получить заголовок и описание с помощью сервисов Slides, таких как getTitle() и getDescription(), после обновления заголовка и описания с помощью Slides API, похоже, что эти результаты не обновляются. Обновленные результаты не могут быть получены даже при использовании 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;
    }
  }
}

Примечание:

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

Использованная литература:

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

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

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

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

Пункты модификации:

  • It seems that when the image is replaced, the title of image is cleared.
    • In order to avoid this, when the image is replaced, it also puts the title. For this situation, batchUpdate of Slides API is used.
  • С точки зрения стоимости процесса сначала создается тело запроса и запрашивается тело запроса. Таким образом, эта ситуация может быть достигнута только одним вызовом 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. Поэтому, если вы хотите заменить много изображений, если возникает ошибка из-за этого, пожалуйста, измените приведенный выше скрипт.
person Tanaike    schedule 07.10.2018
comment
Боюсь, я не могу понять, что происходит с моим кодом. Вы можете увидеть все это в этом pastebin, возможно, вы сможете понять, что не так: pastebin.com/Udp7VaqV Код, который вы вставили, определенно решил то, о чем я просил, но по какой-то причине он просто не работает, когда я запускаю его как часть своего цикла. - person Jonas Bæk; 21.10.2018
comment
@Jonas Bk Мне очень жаль, что я доставил неудобства. Не могли бы вы предоставить подробную информацию о for some reason it just isn't working when I'm running it as part of my loop.? Поскольку сценарий в вашем комментарии отличается от вашего вопроса, для правильного понимания того, что вы хотите сделать, требуется дополнительная информация. Если можете, можете обновить свой вопрос? Я хочу решить вашу проблему. - person Tanaike; 22.10.2018
comment
Большое спасибо за то, что изучили это. Я обновил исходный вопрос полным сценарием, а также объяснением того, что должно произойти. - person Jonas Bæk; 22.10.2018
comment
@Jonas Bk Спасибо за обновление. Я до сих пор не могу понять, что вы хотите сделать, потому что ваш обновленный вопрос сильно отличается от исходного. Я не вижу желаемого результата. Можете ли вы предоставить образец слайда и таблицы, включая требуемые ввод и вывод? А что значит I even tested that specific part as a stand-alone script and it worked fine.? Я думаю, что также важно правильно понимать вашу нынешнюю ситуацию. Прошу прощения за мои плохие знания английского языка. Если вы не можете предоставить эту информацию, сообщите мне. - person Tanaike; 23.10.2018
comment
По сути, я хочу иметь возможность иметь несколько изображений в шаблоне слайд-шоу, которые можно заменить URL-адресами изображений с листа. Я построил его так, чтобы он работал как поиск и замена, поэтому он находит все заголовки с ключом в столбце A и заменяет эти изображения изображением в столбце B с соответствующим ключом. Эта часть работает, но она удаляет заголовки после замены URL-адреса, в результате чего функциональность «шаблона» на самом деле не работает. Я обновил лист примеров и слайды. - person Jonas Bæk; 25.10.2018
comment
@Jonas Bk Спасибо, что ответили и поделились образцами. Но я не могу получить доступ к вашим образцам. Не могли бы вы подтвердить об этом? - person Tanaike; 26.10.2018
comment
Извини за это! Я изменил настройки доступа сейчас. - person Jonas Bæk; 29.10.2018
comment
@Jonas Bk Спасибо за обновление. Я мог получить к ним доступ. И я обновил свой ответ. Не могли бы вы это подтвердить? Если я неправильно понимаю, что вы хотите, извините. - person Tanaike; 30.10.2018
comment
Большое вам спасибо - он отлично справляется со своей задачей! - person Jonas Bæk; 01.11.2018
comment
@Jonas Bk Я рад, что ваша проблема была решена. И тебе спасибо. - person Tanaike; 02.11.2018