如何使用Google Script在Google幻灯片上添加具有特定新布局的新幻灯片?

时间:2017-11-20 07:13:06

标签: javascript google-apps-script google-slides-api google-slides

这是我第一次使用Stackoverflow,我在发布此问题之前尝试进行广泛研究。我也是编程的新手。

以下是我的所作所为:

  1. 在Google幻灯片上创建了一个新的演示文稿,
  2. 在主版面视图中编辑了一个预定义布局 为了拥有一个我想要使用的新布局,
  3. 将主版面的名称编辑为"会议",

  4. 编辑了我想要使用的预定义布局的名称 "办公"

  5. 我的问题是,在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(string)。 (第6行,文件" Office")。

    以下是我尝试过的一些组合,它们给我带来了类似的错误:

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

    如果我只使用presentation.appendSlide(),它会创建一个新幻灯片,但不会使用我想要使用的布局。

    Google Apps Script Reference中有三种方法:

    1. appendSlide(),
    2. appendSlide(布局),
    3. appendSlide(predefinedLayout)
    4. 然而,我似乎无法理解最后两者之间的区别,因为当我尝试使用它们时,它们似乎做同样的事情。

2 个答案:

答案 0 :(得分:3)

您正在传递 appendSlide 方法的布局对象名称,但您应该传递LayoutObject参数。

  

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是一个枚举。它包含演示文稿中常见的布局。阅读所有可用的predefined layouts

使用它们如下;

presentation.appendSlide(SlidesApp.PredefinedLayout.SECTION_TITLE_AND_DESCRIPTION);

答案 1 :(得分:0)

这个答案怎么样?请将此视为几个答案之一。

如果要将“Office”和“Meeting”的布局显示名称与布局对象对应,可以使用以下两种模式。

  1. 使用幻灯片ID附加布局。
  2. 使用幻灯片对象附加布局。
  3. 要使用这些示例脚本,请在Advanced Google ServicesAPI console启用幻灯片API。

    模式1:使用幻灯片ID附加布局

    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()检索。我认为你的“Office”和“Meeting”的布局名称可能是“displayName”。我找不到使用SlidesApp的“displayName”。所以我总是使用Slides API检索“displayName”,如下所示。

    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。关于batchUpdate
      • A1。这用于使用Slides API更新幻灯片。您可以在here查看详细信息。在SlidesApp发布之前,用户已使用高级Google服务使用Slides API。即使在SlidesApp发布之后,也有一些只能做到这一点的作品。所以我用这个。
    • Q2。关于var layout = {}
      • A2。这用于导入在for循环中创建的字典数据。
    • Q3。关于filter()
      • A3。关于此,您可以在here查看该文档。你可以在那里看到一些示例脚本。