[GAS][Sites]テンプレートからページを作成するには: 逆引きGoogle Apps Script

2015 年 9 月 26 日 土曜日

あらかじめ用意しておいたGoogleサイトのページテンプレートをもとに、新しいページを作成する方法について、Google App Scriptヘルプフォーラムへの質問に回答してみました。

Create Page From Template

I am trying to create a UI in a Site that will create a page from a page template and name the page from the entry in the UI.

Here is what I have so far:

仕様は以下の通り。

  • Googleサイトにあらかじめページテンプレートを用意しておく。
  • 「ページテンプレートから新しいページを生成」するためのUIをGoogleサイトに設置する。
  • ページ生成画面にて、生成するページタイトルを入力し、ボタンクリックで新しいページを作成する。

質問者が掲載したコードは以下の通り。

function doGet(e) {
  var siteapp = UiApp.createApplication();
  var mainPanel = siteapp.createVerticalPanel();
  var appLabel = siteapp.createLabel("New Site Proposal").
        setStyleAttribute("font-size", "135%").
        setStyleAttribute("font-weight", "bold").
        setStyleAttribute("line-height", "200%");
  siteapp.setTitle('Share Communication Samples');
  siteapp.add(mainPanel);
  var panel = siteapp.createVerticalPanel();
  var textBox = siteapp.createTextBox();
  textBox.setName('name').setId('name');
  var submitButton = siteapp.createButton('Add Site');
  panel.add(textBox);
  panel.add(submitButton);
  mainPanel.add(appLabel);
  siteapp.add(panel);
  
  return siteapp; }

function createPage(e){
  var siteapp = UiApp.getActiveApplication(); 
  var site = SitesApp.getActiveSite();
  var name = e.parameter["name"];
  var page = site.getTemplates('Site Template');
  
  SitesApp.getPageByUrl('https://sites.google.com/a/onixdev3.com/onix-development---loc-columbus-oh/new-site-proposals/site-template').createPageFromTemplate(name, name, page);
}

この質問に対する私の回答は以下の通り。

There are 2 things you need to know.

1. You need to set the handler to submitButton.
2. There is no ‘getTemplates(string)’ functions.

I think you have to find template by for() loop.

質問者が知っておかなければならないことは2つ。1つ目は、submitボタンにイベントハンドラを設定する必要があること。このままではボタンをクリックしてもなんの反応もないはずです。

 var handler = siteapp.createServerHandler('createPage').
  addCallbackElement(mainPanel);
 var submitButton = siteapp.createButton('Add Site').
  addClickHandler(handler);

2つ目は、名称でテンプレートオブジェクトを取得できないということ。すなわち、現在のところ、サイトに存在するすべてのテンプレートをfor()ループで検索する必要があります。

この回答をもとに修正したコードが質問者から投稿されましたが、for()ループでテンプレートを取得する方法ではなく、どうやら

getPageByUrl(string targeturl)

でテンプレートを取得しようとしたようです。しかし、残念ながらこのメソッドでもテンプレートを取得することはできません。

最終的に以下のコードを投稿しました。

..
..
..

  var resetHandler = siteapp.createServerClickHandler('resetFields');
  resetHandler.addCallbackElement(textBox);
 
  return siteapp;
}

function getTemplateByName_(name){
  var site = SitesApp.getActiveSite();
  var templates = site.getTemplates();
  for(var i=0; i< templates.length; i++){
    if (templates[i].getName() == name){
      return templates[i];
    }
   }
   return null;
}

function createPage(e){
  var siteapp = UiApp.getActiveApplication();
  var name = e.parameter["name"];
  var site = SitesApp.getActiveSite();

  site.createPageFromTemplate(name, name, getTemplateByName_('site-template'));

}

function resetFields(e){
  var siteapp = UiApp.getActiveApplication();
::
::
::

以上です。この回答に対して返信がきていないので上手くいったかは不明です…。

関連記事

コメントをどうぞ

トラックバック

このエントリーのトラックバックURL:

http://www.bmoo.net/archives/2012/02/312616.html/trackback