Reputation: 403
The following is what I did:
Created a new presentation on Google Slides,
Edited one of the predefined layouts on the Master Layout view in order to have a new layout that I want to use,
Edited the name of the Master Layout to "Meeting",
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 combinations 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:
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.
Upvotes: 6
Views: 3552
Reputation: 4273
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 commonly found in presentations. Read all the available predefined layouts
use them as below;
presentation.appendSlide(SlidesApp.PredefinedLayout.SECTION_TITLE_AND_DESCRIPTION);
Upvotes: 3
Reputation: 201378
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.
In order to use these sample scripts, please enable Slides API at Advanced Google Services and API console.
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);
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);
If this was not useful for you, I'm sorry.
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.var layout = {}
filter()
Upvotes: 2