【问题标题】:How to add a new slide with new layout on Google Slides?如何在 Google 幻灯片上添加具有新布局的新幻灯片?
【发布时间】:2017-11-20 07:13:05
【问题描述】:

以下是我所做的:

  1. 在 Google 幻灯片上创建了一个新演示文稿,

  2. 在主布局视图中编辑了预定义布局之一 为了有一个我想使用的新布局,

  3. 将主布局的名称编辑为“会议”,

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

我的问题是在 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. 附加幻灯片(布局),
  3. appendSlide(predefinedLayout)

但是,我似乎无法理解最后两个之间有什么区别,因为当我尝试使用它们时,它们似乎做同样的事情。

【问题讨论】:

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


    【解决方案1】:

    您正在为 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)我将“CUSTOM_1”更改为“Office”,但在 var newSlide = presentation.appendslide(selectedLayout); 行出现以下错误: 找不到方法 appendSlide((class))。 (第 23 行,文件“幻灯片”)。 2) 我使用 Logger.log 行查看幻灯片布局的名称。但是,即使我更改了它的名称,我得到的名称还是“TITLE”、“SECTION_HEADER”等。也许我没有在正确的地方更改名称?
    • 您可能编辑了现有布局。这意味着它已经有了名字。从您的布局列表视图中再次检查名称并将其与日志中可用的名称进行比较。我还没有看到通过我们给出的名称找到布局的方法。当我们添加新布局时,它会显示为 Custom_1..Custom_2 等
    • @RafaelPinheiro 我在here 中询问过。希望高手能帮帮我们。
    • 你是对的,我实际上改变了一些预先存在的布局并试图改变它的名字。感谢您在其他页面中询问它,我会在那里关注它。 @Tanaike 下面的答案似乎也有效,但我仍在努力了解其中每个步骤的作用。
    【解决方案2】:

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

    当您想将“Office”和“Meeting”的布局显示名称与布局对象对应时,可以使用以下2种模式。

    1. 使用幻灯片 ID 附加布局。
    2. 使用幻灯片对象附加布局。

    要使用这些示例脚本,请在 Advanced Google ServicesAPI console 启用 Slides 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”和由getLayoutName() 检索到的“name”。我认为您的“办公室”和“会议”的布局名称可能是“显示名称”。我无法使用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);
    

    参考资料:

    如果这对你没有用,我很抱歉。

    编辑:

    • 第一季度。关于批量更新
      • A1。这用于使用 Slides API 更新幻灯片。您可以在here查看详细信息。在SlidesApp 发布之前,用户已经通过高级 Google 服务使用 Slides API。即使在SlidesApp发布之后,也有一些作品只有这个才能做到。所以我用这个。
    • 第二季度。关于var layout = {}
      • A2。这用于导入在 for 循环中创建的字典数据。
    • 第三季度。关于filter()
      • A3。关于这一点,您可以在here 看到文档。您可以在那里看到一些示例脚本。

    【讨论】:

    • 谢谢,田池!确实,这行得通。我仍在尝试了解您的代码的每一行的作用。在模式 1 中,我在理解 batchUpdate 和请求时遇到了一些困难(我阅读了您推荐的参考资料以及其他一些参考资料)。此外,变量布局是什么类型?当您将其设置为 var layout = {}. 时,我不明白它会创建什么
    • 在模式 2 上,我不明白哪个函数是函数(e)。你能告诉我它是从哪里来的吗?我必须启用 Slides API 中的其他位置吗?
    • @Rafael Pinheiro 对于给您带来的不便,我深表歉意。我更新了我的答案。请确认。
    猜你喜欢
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2022-09-23
    • 2018-01-12
    相关资源
    最近更新 更多