Baldanders.info

Google spreadsheets で遊んでみた

NaRaKa さんの作られた「目次作成支援ツール」は Google spreadsheets と組み合わせることで色々できるらしい。

「目次作成支援ツール」自体は Yahoo Pipes を使って note のコンテンツを RSS で吐き出すもので,これを Google spreadsheets の IMPORTFEED 関数に食わせることでシート上に RSS の情報が展開されるというもの。

もちろんこれだけでは大したことはないけど,スプレッドシート関数や JavaScript ベースのカスタム関数を使えれば目次生成の自動化ができるやん。 というわけで,少ない休日を潰して遊ぶことにした。

今回の目標

  1. Yahoo Pipes を使った「目次作成支援ツール」で色々遊んでみる
  2. 実際に IMPORTFEED 関数を使ってシート上に RSS 情報を展開してみる
  3. GAS (Google Apps Script)の基本的な使い方を学ぶ
  4. Google Spreadsheets を介して GAS の JavaScript を使って目次情報(HTML)を吐き出すところまで試しに組んでみる

まぁこんなところだろうか。

Yahoo Pipes は5秒で挫折

実は Yahoo Pipes は使ったことがない。 つか,こういう CASE (Computer Aided Software Engineering)型のツールって苦手なんだよ。 私の直感に反する。 NaRaKa さんが作られたのを拝見したけど,私には無理だと悟りました。

CASE ツールは1990年代に物凄く流行って,これがあれば将来プログラマは要らなくなる,とまで言われたほどだ。 私自身も実は CASE ツールを作る仕事(の一部)に関わったことがある。 通信シミュレータで,私は LAPB と LAPD の内部ロジックを組んだだけだったけど(今は昔)。

それはともかく,自前でイジコジするのは(有為な時間では)無理だとわかったので,何も考えず,ありがたく NaRaKa さんのツールを使わせていただくことにした。

IMPORTFEED で遊ぶ

NaRaKa さんのツールをブラウザで開くと以下の画面が表示される。

これを使って RSS の URL を取得すると以下のようになった。

http://pipes.yahoo.com/pipes/pipe.run?_id=e6a8b8335aaaaa5d4d748efe8dde7728&_render=rss&limit=2&num=1&username=spiegel&%E9%99%A4%E5%A4%96=Talk

長っ! ちなみに “spiegel” って書かれてる部分がユーザ名になる。 num がページ名で,limit が取得する item 数を指定する。 “num=1&limit=2” なら先頭から最大20個取ってくる。 最後の「除外=Talk」ってのは除外するコンテンツのタイプを指定する。 Talk (トーク)は Twitter の tweet みたいなもんで,140文字の制限があるしタイトルも付けられないが, follower への告知なんかによく使われているようである。

これを IMPORTFEED に食わせるわけだ。 こんな感じ。

=IMPORTFEED("http://pipes.yahoo.com/pipes/pipe.run?_id=e6a8b8335aaaaa5d4d748efe8dde7728&_render=rss&limit=2&num=1&username=spiegel&%E9%99%A4%E5%A4%96=Talk", "items", true)

第2引数の "items" は展開する要素を指定しているのだが, "items" を指定すると全部表示されてしまうので注意。 例えばタイトルだけを取得したいなら "items title" などと指定する。 第3引数は先頭行を見出しにするかどうかを指定する。 先頭行を見出しにするとシートのフィルタ機能が使いやすくなるのでお薦めである。 あと(後述するが)カスタム関数で複数のセルを配列として引数に指定する場合に見出し行があると連想配列が使えるので,この点からもお薦めできる。

IMPORTFEED 関数を使う際は「スプレッドシートの設定」に注意。

再計算の項目を「変更時」以外にしないといつまで経っても内容が更新されない。 とはいえ「変更時と毎分」では note と Yahoo Pipes に負荷がかかりすぎるので「変更時と毎時」くらいが無難だろう。 まぁ,シートを開きっぱなしにしなきゃいいんだけどね。

JavaScript でシートの配列を扱う

Google spreadsheets では組み込みの関数の他に自前でカスタム関数を作って利用することができる。 カスタム関数には Google Apps Script を使う。 実態は JavaScript である。

これの素晴らしい点はシートとカスタム関数とのやりとりで行列(matrix)が使えることだ。 いや,そこ,笑わない(笑) スプレッドシートなんだから当たり前じゃん,て私だってそう思うけど,でも面白いでしょ。

実際,スプレッドシート(spreadsheet)は計算過程を可視化するのにとてもよいツールだ。 昔話だが,30次のバンドパスフィルタをソフトウェアで組んだんだけど,検証用に Excel でもシミュレートできるものを作ってくれと言われて泣きながら徹夜したほろ苦い思い出があるのだが,意外にも,そのシートの恩恵に一番預かったのは私自身だったりしたので,スプレッドシートは侮れない。 だからといって,私に Word や Excel の使い方を教えてくださいとか言ってこないように。

たとえばこんな関数を書いてみる。

//回転行列ごっこ(笑)
function rotation_matrix(){
 return [["cosθ","-sinθ"],
         ["sinθ","cosθ"]];
}

これを適当なセルに「=rotation_matrix()」みたいな感じで書くと,以下のように出力される。

逆に「=hogeFunc(A1:A2, B1:B2)」みたいな感じで引数を指定すると

ってな感じで配列を扱うこともできる。 ほら,なんか楽しいでしょ。

ほんじゃあ目次生成関数を作ってみようか

ちうわけで,早速作ってみた。 私は Google のプライバシー・ポリシーをあまり信用してないので,コピペしたものを以下のファイルに入れておく。

GAS の使い方は各自調べてちょうだい。 大丈夫, Google 先生が懇切丁寧に探してくれるから。

たとえば,さきほどの IMPORTFEED の長ったらしい呪文を E1 のセルにセットしたとしよう。 すると E 列には Title, F 列には Author, G 列には URL, H 列には Date Created,I 列には Summary がそれぞれ展開される。 これを先ほどのスクリプトで定義した getNoteTocHTML の引数に組み入れて,適当なセルに記述する。

=getNoteTocHTML(E1:E40, G1:G40, H1:H40)

引数の順番は不同で大丈夫だけど,かならず Title,URL,Date Created の列を指定すること(途中で面倒くさくなったのでパラメータチェックとか端折ってるのよ)。

結果はこんな感じ。

ダサいとか言わない。 見た目のデザインは壊滅的に苦手なんだってば。 ここでは 年・月・日・タイトル&URL がちゃんと整理された形で出力していることを確認していただければ幸い。 もちろんこれはひとつのやり方にすぎないので,もっとカッコイイ方法とかあれば,それ下さい!

注意点:

  1. NaRaKa さんのツールの出力ではタイトルにコンテンツの種別とユーザ名が付加される。 これはカッコ [...] で囲んであるので簡単に除去できる。 例えばスプレッドシートの関数を使うなら以下のように指定すれば良い:
    =TRIM(REGEXREPLACE(E2, "\[.*\]", ""))
  2. NaRaKa さんのツールでは日付のフォーマットに間違いがあり,timezone が +0000 になっているため,9時間ずれる。 これをスプレッドシートの関数を使って修正するなら以下のように指定する(例では強引に JST に修正している):
    =REGEXREPLACE(H2, "\+[0-9]{4}", "+0900")
    この件は NaRaKa さんには報告済みなので,もしかしたら直るかもしれない。

そうそう,上述のコードは CC0 で公開することにしたので,好きに使っちゃって下さい。 私は今後メンテ等はせず放置プレイにする予定です。

prototype に触れないとか

いや, JavaScript でちょっとしたコードを組む場合でも,簡単なクラスは作るから,当然 prototype オブジェクトに触ることになるよね。 でも GAS って prototype オブジェクトに追加したオブジェクトを認識できないらしい。 これに気づくのに1時間位かかっちまったよ。

みんなどうやってるの? これけっこう致命的だよね。 ググってみると,グロバールにダミーメソッドを置いて,いわば GAS を騙してみたり,あるいは prototype オブジェクトそのものをグローバルに置こうとしたり,なんか色々苦労してるみたい。 私は諦めてコンストラクタにメソッドを書きました。 これが効率悪いのは知ってるけど,へんな hack もどきは使いたくなかったし,使用頻度も多くないので,まぁいいかって感じで。

でもこれだとコードの使い回しがしづらいよね。 中規模以上の開発には向かないような気がするんだけど,ホンマみんなどうしてるんだろう。

まぁ,お遊戯としては十分楽しめたので,今日はこのへんで。

photo
Google Apps Scriptクイックリファレンス
横山 隆司
秀和システム 2013-01

Google Appsでつくる仕事便利ツール ~Google Apps Scriptで実践構築~ Google クラウドスクリプティング Google Apps ScriptによるGoogleパワーアップ活用ガイド 小さな会社の Google Apps 導入・設定ガイド (Small Business Support) Google API Expertが解説する Google Apps拡張ガイド Xcode5徹底解説 for iOS/OSX

by G-Tools , 2014/05/26