Как преобразовать элементы в тот же размер, что и у первого выбранного элемента?

Я хочу установить размер всех элементов как размер первого выбранного элемента. но, похоже, что-то не так с моим кодом, почему-то первый размер элемента не работает для других.

См. Прикрепленный сценарий

/*
 * Make all elements same size
 */
function sameSizeElements() {
  var selection = SlidesApp.getActivePresentation().getSelection();
  var selectionType = selection.getSelectionType();
  var pageElements = selection.getPageElementRange().getPageElements();
  
  //iterate the selected page elements to grab the values of each positiion
  for (var i = 0; i < pageElements.length; i++) {
  
    if(i != 0){
      pageElements[i].setWidth(pageElements[0].getWidth());
      pageElements[i].setHeight(pageElements[0].getHeight());
    }
  }   
}

Вот полный код, который вы можете поместить в файл ScriptEditor > code.js по умолчанию и обновить слайд. он будет работать так, как вы хотите отлаживать.

Обновлено

Мы обсуждаем с командой отслеживания проблем Google App Script - https://issuetracker.google.com/issues/162545277

установите этот протент и проверьте, что он работает

2 ответа

Дополнительный контекст к проблеме:

когда вызывается функция на стороне сервера, ctx объект отправлен в /invoke конечная точка, которая, среди прочего (идентификатор сеанса ssid, идентификатор документа docId, номер ревизии rev, и тип приложения app), содержит данные о выбранных в данный момент PageElements в значении свойства с ключом sel.

Значение представляет собой массив массивов строк и чисел, из которых только один из элементов содержит строки - если вы внимательно посмотрите, эти строки являются идентификаторами объектов (вы можете подтвердить с помощью getObjectId метод) в порядке выбора.

По крайней мере, это подтверждает, что порядок выбора может соблюдаться, но способ управления вышеупомянутым списком на стороне сервера меняет этот порядок. К сожалению, я не смог подтвердить какой-либо конкретный порядок того, как элементы (кроме группировки идентификаторов формыg8edc625556_0_0) возвращаются .getSelection().getPageElementRange().getPageElements() цепочка методов:

Как насчет этого метода в качестве текущего обходного пути?

Проблема и решение:

На текущем этапе, к сожалению, кажется, что эта ошибка все еще не решена. Таким образом, в вашем случае первое выбранное изображение не может быть восстановлено. Думаю, что это текущая причина вашей проблемы.

Для достижения вашей цели в качестве текущего обходного пути я хотел бы предложить следующий алгоритм.

  1. Выберите изображение, которое используется в качестве основного размера, и скрипт будет запущен.
    • Идентификатор объекта изображения сохраняется в PropertiesService.
  2. Выберите изображения, размер которых вы хотите изменить, и скрипт запустится.

Когда ваш скрипт изменяется для этого потока, он становится следующим.

Измененный скрипт:

function allMenu(){
  var slideUi = SlidesApp.getUi();
  slideUi.createMenu('LAK')
      .addSeparator()
      .addSubMenu(slideUi.createMenu('Sizes')
      .addItem('Select base image', 'selectBaseImage')  // Added
      .addItem('Same Size', 'sameSizeElements'))
      .addToUi();
}

// 1. At first, it saves an image which is used as the base image.
function selectBaseImage() {
  var selection = SlidesApp.getActivePresentation().getSelection();
  var pageElements = selection.getPageElementRange().getPageElements();
  if (pageElements.length == 1) {
    PropertiesService.getScriptProperties().setProperty("baseImage", pageElements[0].getObjectId());
  } else {
    throw new Error("Select one image.");
  }
}

// 2. As the next step, the selected images are resized using the saved image.
function sameSizeElements() {
  var prop = PropertiesService.getScriptProperties();
  var objectId = prop.getProperty("baseImage");
  if (objectId != "") {
    var selection = SlidesApp.getActivePresentation().getSelection();
    var baseImage = selection.getCurrentPage().getPageElementById(objectId);
    var pageElements = selection.getPageElementRange().getPageElements();
    for (var i = 0; i < pageElements.length; i++) {
      pageElements[i].setWidth(baseImage.getWidth());
      pageElements[i].setHeight(baseImage.getHeight());
    }
    prop.deleteProperty("baseImage");
  } else {
    throw new Error("Base image was not found.");
  }
}

Результат:

Ссылки:

Другие вопросы по тегам