简体   繁体   中英

How to add a new slide with new layout on Google Slides?

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 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:

  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.

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

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 :

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM