最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to add a new slide with new layout on Google Slides? - Stack Overflow

programmeradmin1浏览0评论

The following is what I did:

  1. Created a new presentation on Google Slides,

  2. Edited one of the predefined layouts on the Master Layout view in order to have a new layout that I want to use,

  3. Edited the name of the Master Layout to "Meeting",

  4. Edited the name of the predefined layout that I want to use to "Office".

My problem is that on Google Script I am not being able to reference this specific predefined layout that I want to use.

So far, my code is the following:

function AddSlideToPresentatio() {

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

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

I have absolutely no idea on why this doesn't work. When I try to run it, I get the error:

"Cannot find method appendSlide(string). (line 6, file "Office").

The following are some of the binations that I tried, and they get me similar errors:

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

If I just use presentation.appendSlide() it creates a new slide, but not with the layout that I want to use.

In the Google Apps Script Reference there are three methods:

  1. appendSlide(),
  2. appendSlide(layout),
  3. appendSlide(predefinedLayout)

However, I can't seem to understand what is the difference between that last two, because when I try to use them they seem to do the same thing.

The following is what I did:

  1. Created a new presentation on Google Slides,

  2. Edited one of the predefined layouts on the Master Layout view in order to have a new layout that I want to use,

  3. Edited the name of the Master Layout to "Meeting",

  4. Edited the name of the predefined layout that I want to use to "Office".

My problem is that on Google Script I am not being able to reference this specific predefined layout that I want to use.

So far, my code is the following:

function AddSlideToPresentatio() {

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

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

I have absolutely no idea on why this doesn't work. When I try to run it, I get the error:

"Cannot find method appendSlide(string). (line 6, file "Office").

The following are some of the binations that I tried, and they get me similar errors:

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

If I just use presentation.appendSlide() it creates a new slide, but not with the layout that I want to use.

In the Google Apps Script Reference there are three methods:

  1. appendSlide(),
  2. appendSlide(layout),
  3. appendSlide(predefinedLayout)

However, I can't seem to understand what is the difference between that last two, because when I try to use them they seem to do the same thing.

Share Improve this question edited Aug 3, 2020 at 8:33 0Valt 10.4k9 gold badges39 silver badges64 bronze badges asked Nov 20, 2017 at 7:13 Rafael PinheiroRafael Pinheiro 4231 gold badge7 silver badges23 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 3

You are passing layout object's name for the appendSlide method, but you should pass LayoutObject parameter.

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 is an enum. It contains layouts that monly found in presentations. Read all the available predefined layouts

use them as below;

presentation.appendSlide(SlidesApp.PredefinedLayout.SECTION_TITLE_AND_DESCRIPTION);

How about this answer? Please think of this as one of several answers.

When you want to correspond the layout displayname of "Office" and "Meeting" to the layout object, you can use following 2 patterns.

  1. Append layout using slide IDs.
  2. Append layout using slide objects.

In order to use these sample scripts, please enable Slides API at Advanced Google Services and API console.

Pattern 1 : Append layout using slide IDs

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

Pattern 2 : Append layout using slide objects

There are 2 names for the layout. They are "displayName" which can be seen at the browser and "name" which is retrieved by getLayoutName(), respectively. I thought that your layout names of "Office" and "Meeting" may be "displayName". I couldn't find "displayName" using SlidesApp. So I always retrieve "displayName" using Slides API as follows.

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

References :

  • Slides.Presentations.get()
  • Slides.Presentations.batchUpdate()
  • getLayoutName()

If this was not useful for you, I'm sorry.

Edit :

  • 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.
发布评论

评论列表(0)

  1. 暂无评论