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 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:
- appendSlide(),
- appendSlide(layout),
- 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:
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 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:
- appendSlide(),
- appendSlide(layout),
- 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 badges2 Answers
Reset to default 3You 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.
- Append layout using slide IDs.
- 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 afterSlidesApp
was published, there are some works that only this can do. So I use this.
- A1. This is used to update slides using Slides API. You can see the detail information at here. Before the
- 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.