When it’s ready.

出来るまで出来ない

GoogleAppsScriptで、スプレッドシートの内容でをSiteを作成したり修正したり出来るぉ

GDD2010に参加しました。GASで動かないところがあったんだけど、パメラ先生が来日されていたのでオフィスアワー時に質問したら速攻解決しました。

Docsのスプレッドシートから任意の範囲をSitesのページに追加します、挙動としては
・ページが存在しない場合は新規ページを作成する
・ページが存在する場合は、既存の内容にスプレッドシートの内容を追加する

この様な挙動をするためには、DocsとSitesの固有の場所を指定してあげる必要があります。

docsのスプレッドシートを取得する

スクリプト自体は、スプレッドシートに内蔵されているので自分自身のIDを調べます
そのIDを元に、SpreadsheetAppクラスからシートを取得し、タブ名を指定することで特定シートのデータが取得できます。

function getSheetID(){
  // シートのユニークIDの取得
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  return doc.getId();
}

function getSheet(){
  // スプレッドシートの取得 (tabネーム:s-1)
  var tab_name = 's-1'
  var s_id = getSheetID();
  var all_sheet = SpreadsheetApp.openById(s_id);
  var one_sheet = all_sheet.getSheetByName(tab_name);
  return one_sheet
}

スプレッドシート内の特定のセルの情報を取るには、range指定をします。開始セルと終了セルの座標を指定しその矩形範囲がrangeとして取得可能です。a1セルを座標(1,1)で表します。終了セルは、開始セルからの相対座標で表します。例えば、a1:c3の場合はgetRange(1,1,3,3)と表します。
さらにセルから値を取るには、”.getValues()”で抜けます。

var content = getSheet();
var add_str = content.getRange(1,1,3,3).getValues();

Sitesの取得する

sitesに関してはいくつかのパラメーターを指定する必要があります

  1. ドメイン名
  2. サイト名
  3. トップページ名

の3つでユニークなPageが取得可能です。新規にページを作るには親ページを指定し、ページタイトルとページのURLを指定することで追加可能です。新規か既存か調べるのがめんどくさいそうだったので、try-catchしてますがあまりいい方法ではないきがします。

YOUR_DOMAIN = 'a2c.biz';
YOUR_SITE = 'gas'
SITE_URL = "https://sites.google.com/a/" + YOUR_DOMAIN + "/" + YOUR_SITE + "/";
TOP_NAME = 'home'
function newSite(){
  var site = SitesApp.getSite('a2c.biz', 'gas');
  var parentPage = site.getChildByName(TOP_NAME + '/' + 'test_page1');
  var page_url = '123456';
  
  var webTitle = 'テスト用のタイトル';
  
  try{
    var webPage = site.createWebPage(webTitle, page_url, newWebPage('page create'));
    webPage.setParent(parentPage);
  }catch(e){
    var targetPage = site.getChildByName(page_url);
    var add_str = 'just edit!';
    targetPage.setHtmlContent(modifyWebPage(targetPage.getHtmlContent(), add_str));
  }
}

新規ページを作るときには、適当にタグ付きのstrを渡してあげるだけで大丈夫です。

function newWebPage(add_str){
  var web = '';
  web += ('str:' + add_str +'<br/>');
  web += ('<br/>');
  
  return web;
}

ページを編集するにはタグ付き要素が帰ってくるのでにようなタグで中身をいじって返します。
以下の例では、日付と引数の文字列を追加しています。

function modifyWebPage(pageHtml, add_str){
  var dt = Utilities.formatDate(new Date(), getTimeZone(), "yyyy/MM/dd' 'HH:mm:ss");
  var content = '';
  content +=  '<h1>' + add_str + '</H1>' + dt + '<br>';
  content += ('</td></tr></tbody></table>');

  return  pageHtml.replace('</td></tr></tbody></table>', content);
}

全体

上記コードをまとめて書くと

function getSheetID(){
  // シートのユニークIDの取得
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  return doc.getId();
}

function getSheet(){
  // スプレッドシートの取得 (tabネーム:s-1)
  var tab_name = 's-1'
  var s_id = getSheetID();
  var all_sheet = SpreadsheetApp.openById(s_id);
  var one_sheet = all_sheet.getSheetByName(tab_name);
  return one_sheet
}

YOUR_DOMAIN = 'a2c.biz';
YOUR_SITE = 'gas'
SITE_URL = "https://sites.google.com/a/" + YOUR_DOMAIN + "/" + YOUR_SITE + "/";
TOP_NAME = 'home'
function newSite(){
  var site = SitesApp.getSite('a2c.biz', 'gas');
  var parentPage = site.getChildByName(TOP_NAME + '/' + 'test_page1');
  var pagename = '123456';
  
  var webTitle = 'テスト用のタイトル';
  
  try{
    var webPage = site.createWebPage(webTitle, pagename, newWebPage('page create'));
    webPage.setParent(parentPage);
  }catch(e){
    var targetPage = site.getChildByName(pagename);
    var content = getSheet();
    var add_str = content.getRange(1,1,3,3).getValues();
    targetPage.setHtmlContent(modifyWebPage(targetPage.getHtmlContent(), add_str));
  }
}
  
function modifyWebPage(pageHtml, add_str){
  var dt = Utilities.formatDate(new Date(), getTimeZone(), "yyyy/MM/dd' 'HH:mm:ss");
  var content = '';
  content +=  '<h1>' + add_str + '</H1>' + dt + '<br>';
  content += ('</td></tr></tbody></table>');

  return  pageHtml.replace('</td></tr></tbody></table>', content);
}
  
  
function newWebPage(add_str){
  var web = '';
  web += ('str:' + add_str +'<br/>');
  web += ('<br/>');
  
  return web;
}

特に意味の有ることはないですが、スプレッドシートからSiteを生成と変更することが可能です。スプレッドシートには、トリガーとして、cromや修正時など色々あるので、外部からスプレッドシートにデータを書き込むだけでそれなりのまとめページを自動で生成することが可能になります。

GDDも終わって一段落なので、GAS勉強会をそろそろやろうかと思います。ATND立てたら告知します。平日と週末だったらどっちの方がいいですか?