Как добавить новый слайд с новым макетом в Google Slides?

Вот что я сделал:

  1. Создал новую презентацию в Google Slides,

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

  3. Отредактировал имя основного макета на "Встреча",

  4. Отредактировал имя предопределенного макета, который я хочу использовать в Office.

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

Пока что мой код следующий:

function AddSlideToPresentatio() {

// The following line opens my presentation
var presentation = SlidesApp.openById('PresentationID');

//Now, I try to use my new layout
  presentation.appendSlide("Office");
}

Я понятия не имею, почему это не работает. При попытке запустить выдает ошибку:

Не удается найти метод appendSlide (строка). (строка 6, файл Office).

Ниже приведены некоторые из комбинаций, которые я пробовал, и они вызывают похожие ошибки:

presentation.appendSlide('Office');
presentation.appendSlide(Office);
presentation.appendSlide("Meeting - Office");
presentation.appendSlide('Meeting - Office');
presentation.appendSlide(Meeting - Office);

Если я просто использую presentation.appendSlide(), создается новый слайд, но не с макетом, который я хочу использовать.

В справочнике скриптов Google Apps есть три метода:

  1. appendSlide (),
  2. appendSlide (макет),
  3. appendSlide (предопределенныйLayout)

Однако я не могу понять, в чем разница между этими двумя последними, потому что, когда я пытаюсь их использовать, кажется, что они делают то же самое.


person Rafael Pinheiro    schedule 20.11.2017    source источник


Ответы (2)


Вы передаете имя объекта макета для метода appendSlide, но вы должны передать _ 1_.

appendSlide (LayoutObject)

// The following line opens my presentation
var presentation = SlidesApp.openById('PresentationID');
// this will return an array of all the layouts
var layouts = presentation.getLayouts();

//if your first array item is the office layout
var newSlide = presentation.appendSlide(layouts[0]);

//Orelse you can search for your layout
var selectedLayout;
for(var item in layouts)
{
   //Logger.log(layouts[item].getLayoutName());
   if(layouts[item].getLayoutName() =='CUSTOM_1')
   {
     selectedLayout = layouts[item];
   }
}
var newSlide = presentation.appendSlide(selectedLayout);

PreDefinedLayout - это перечисление. Он содержит макеты, которые обычно встречаются в презентациях. Прочтите все доступные стандартные макеты

используйте их, как показано ниже;

presentation.appendSlide(SlidesApp.PredefinedLayout.SECTION_TITLE_AND_DESCRIPTION);
person iJay    schedule 20.11.2017
comment
Спасибо за помощь! Я бы предпочел использовать второй вариант (поиск по имени). У меня две проблемы с этим: 1) Я изменил «CUSTOM_1» на «Office», но в строке var newSlide = presentation.appendslide (selectedLayout); появляется следующая ошибка: Не удается найти метод appendSlide ((класс)). (строка 23, файл Slides). 2) Я использовал строку Logger.log, чтобы узнать, как называются макеты слайдов. Однако, несмотря на то, что я изменил его имена, я получаю имена как TITLE, SECTION_HEADER и т. Д. Может быть, я не меняю имена в правильном месте? - person Rafael Pinheiro; 20.11.2017
comment
Возможно, вы редактировали существующий макет. что означает, что у него уже есть имя. Еще раз проверьте имя в представлении списка макетов и сравните его с именами, доступными в журнале. Я не видел способа найти макет по имени, которое мы даем. Когда мы добавляем новый макет, он отображается как Custom_1..Custom_2 и т. Д. - person iJay; 20.11.2017
comment
@RafaelPinheiro Я спросил об этом в здесь. Надеюсь, что какой-нибудь эксперт нам поможет. - person iJay; 20.11.2017
comment
Вы правы, я действительно изменил существующий ранее макет и попытался изменить его название. Спасибо, что спросили об этом на другой странице, я буду следить за ним там. Ответ @Tanaike, приведенный ниже, также, похоже, работает, но я все еще пытаюсь понять, что делает в нем каждый шаг. - person Rafael Pinheiro; 20.11.2017

Как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Если вы хотите, чтобы отображаемое имя макета «Офис» и «Встреча» соответствовало объекту макета, вы можете использовать следующие 2 шаблона.

  1. Добавить макет, используя идентификаторы слайдов.
  2. Добавить макет с помощью слайд-объектов.

Чтобы использовать эти образцы скриптов, включите Slides API на странице Advanced Google Services и консоль API .

Шаблон 1. Добавление макета с использованием идентификаторов слайдов

var displayName = "Office"; // Office or Meeting you gave

var presentationId = SlidesApp.getActivePresentation().getId();
var layouts = Slides.Presentations.get(presentationId).layouts;
var layout = {};
for (i in layouts) {
  layout[layouts[i].layoutProperties.displayName] = layouts[i].objectId;
}
var resource = {"requests": [{"createSlide": {"slideLayoutReference": {"layoutId": layout[displayName]}}}]};
Slides.Presentations.batchUpdate(resource, presentationId);

Шаблон 2: Добавление макета с помощью объектов слайда

У раскладки есть 2 названия. Это «displayName», которое можно увидеть в браузере, и «name», которое извлекает getLayoutName() соответственно. Я подумал, что имена вашего макета «Офис» и «Встреча» могут быть «displayName». Мне не удалось найти "displayName" с помощью SlidesApp. Поэтому я всегда получаю displayName с помощью Slides API следующим образом.

var displayName = "Office"; // Office or Meeting you gave

var s = SlidesApp.getActivePresentation();
var layouts = Slides.Presentations.get(s.getId()).layouts;
var layout = {};
for (i in layouts) {
  layout[layouts[i].layoutProperties.displayName] = layouts[i].layoutProperties.name;
}
var layoutObj = s.getLayouts().filter(function(e){return e.getLayoutName() == layout[displayName]})[0];
s.appendSlide(layoutObj);

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

Если это вам не пригодилось, извините.

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

  • Q1. About batchUpdate
    • A1. This is used to update slides using Slides API. You can see the detail information at here. Before the SlidesApp is published, users have used Slides API using Advanced Google Services. Even after SlidesApp was published, there are some works that only this can do. So I use this.
  • Q2. About var layout = {}
    • A2. This is used to import the dictionary data created at for loop.
  • Q3. About filter()
    • A3. About this, you can see the document at here. You can see the some sample scripts there.
person Tanaike    schedule 20.11.2017
comment
Спасибо, Танаике! Действительно, это работает. Я все еще пытаюсь понять, что делает каждая строка вашего кода. В шаблоне 1 мне немного сложно понять batchUpdate и запрос (я читал ссылки, которые вы рекомендовали, а также некоторые другие). Кроме того, какого типа является переменная раскладка? Я не понимаю, что он создает, когда вы устанавливаете его как var layout = {}. - person Rafael Pinheiro; 20.11.2017
comment
А в шаблоне 2 я не понимаю, какая функция является функцией (e). Не могли бы вы показать мне, откуда это? Это что-то еще в API слайдов, которое мне пришлось включить? - person Rafael Pinheiro; 20.11.2017
comment
@Rafael Pinheiro Приносим извинения за неудобства. Я обновил свой ответ. Пожалуйста, подтвердите. - person Tanaike; 21.11.2017