GASのライブラリを使って楽したい② 外部のJSライブラリを使ってみる(:3」[＿]﻿

Google Apps Script Advent Calendar五日目です。
昨日から三日連続でGASのライブラリ機能の話をしていってます。

今日はもっと楽をしたいので、外部のJSライブラリを使ってみます。

# 動くの?

最近はnode.jsのおかげかDOMに依存しないライブラリが増えており
意外とGASで利用してもいい感じで動いてくれます。
時々修正が必要なケースも見られますが、
node.jsで使えるものは大体大丈夫と思っていて問題無いと思います。

# 例 moment.js
## moment.js って何?
moment.jsは日付操作ライブラリです。

[moment.jsのドキュメント](http://momentjs.com)

javascriptではDate型を文字列にしたり、文字列から日付にしたり、
日付の計算や、比較をするのが割りと面倒臭いです。
その辺りを良い感じで吸収してくれるのが、moment.jsです。

例えば文字列をDate型オブジェクトにするコードはmoment.jsでは以下のように書けます。

```javascript
var date = moment("20111031", "YYYYMMDD").toDate();
```

簡単ですね！

## 利用シーン

僕の場合はGASのバッチのタイムアウト制御などによく利用します。

GASでは一つのメソッドの最大起動時間は6分となっています。
大量のデータを処理する場合などはよくこの最大起動時間に到達し、
アプリケーションがタイムアウトエラーとなってしまいます。

そのためアプリケーション内で処理の開始時の時間を取得し、
処理途中で5分経過していないかを見て、経過してしまっているようならば、
そのバッチを1分間後に再起動するみたいなロジックをよく書きます。

momemt.jsでは[時間の比較](http://momentjs.com/docs/#/displaying/difference/)や[時間計算](http://momentjs.com/docs/#/manipulating/add/)が簡単にできるため重宝しています。

そのコードも最後に書きますので見てみてください。

## GASライブラリ化

ではGASでどのようにすればライブラリ化出来るかを説明していきます。

### 準備

1. `moment.js`のサイトよりコードをダウンロードしてきます。 ※直接[ここ](https://raw.github.com/timrwood/moment/1.7.2/moment.js)にあるものをコピーしても良いです。

2. GAS Editorを開き1.のファイルの中身をエディターに貼り付けます。

3. Ctrl + sとかで保存します。 この時プロジェクト名が[前回記事](http://qiita.com/items/7bbd86425ae8d0641d50)の識別子として利用されるので`Moment`とかつけておくといいと思います。

4. 保存をしたらメニューより「ファイル」→「版を管理...」をクリックします。

5. ダイアログが表示されると思うので中にあるテキストボックスに適当な内容を入力し「新しいバージョンを保存」をクリックします。

6. 一覧に追加されたら「OK」ボタンをクリックします。

これで準備は完了です。

### プロジェクトキーの取得

[前回](http://qiita.com/items/7bbd86425ae8d0641d50)の記事で説明したように、ライブラリを使うにはプロジェクトキーが必要です。
プロジェクトキーを取得するには

1. メニューより「ファイル」→「プロジェクトのプロパティ」をクリック

2. 「プロジェクトキー」という項目があるのでその横にあるキーをコピーします。

あとは前回と同じようにライブラリとして他のプロジェクトに追加してみてください。

## 利用

前回ライブラリの利用方法を書いているので今回はこのmoment.jsを使ってバッチの再起動ロジックを書いてみたいと思います。

```javascript:バッチの再起動ロジック

//処理開始時の時間を取得
var start = Moment.moment();



for(var i =0; i < bigDataList; i++) {
  //すげーデカイ処理

  //現在時間取得
  var now = Moment.moment();
  
  //現在時と開始時間を分で比較し、5分経過しているか見る
  if(now.diff(start , "minutes") >= 5) {
    //ここまでの処理経過をScriptPropertiesとかに保存、上には書いてませんがその値から処理を再起動します。

    //一分後に再起動
    var triggerId = ScriptApp.newTrigger("再起動したい関数名").timeBased().at(Moment.moment().add("minutes" ,1 ).toDate()).create().getUniqueId();

    //上には書いてませんが、実際には再起動用に登録したtriggerを削除するロジックが入ってたりします。そのためにtriggerIdを登録しておきます。
    ScriptProperties.setProperty("triggerId", triggerId);    
  } 
}
```

# まとめ

いかがだったでしょうか?
結構簡単に日付計算とかが出来るようになったと思います。
ちょっとライセンス周りが不明だったためプロジェクトキーを公開しませんでしたが、
自分用にライブラリを作って使うと楽だと思います。

僕の場合はこのmoment.js以外にも

* [ShowDown](https://github.com/coreyti/showdown)
 * JSでMarkdownをパースするためのライブラリ
 * 実はここまでのQiitaへのポストはGASで作ったエディタからAPI経由で投稿しています。その際にプレビューとしてShowdownを使っています。
 * なお、ShowDownを使う場合は若干修正が必要です。

* [Jarty](https://github.com/kotas/jarty)
 * PHPのテンプレートエンジンSmartyのJavascript実装です。
 * Google SitesのテンプレートページをSmarty形式で書いて、GASからJartyを利用して値をバインドし大量のGoogle Sitesページを作ったりしてます。

* [Google diff-match-patch](http://code.google.com/p/google-diff-match-patch/)
 * テキストのdiff パッチライブラリ
 * 個人的に作っている[GAS Update Notifier a.k.a I hack me](https://script.google.com/macros/s/AKfycbz98NsP02DO46Y2kTdTnhqOvqfWuJJpyuznRtfH34cazge33Ew/exec)というGASの更新通知アプリでGoogleサービス(SpreadsheetAppとか)にどのようなメソッドが増えたかを比較するために使っています。

などなどを利用しています。
node.jsのお陰でサーバーサイドで利用できるライブラリが増えてきて幸せですね
色々探してやってみてください。

ということで今日は以上です。
明日は、自分でライブラリを作る編になります。