Google Apps Script でお手軽 WEB API をサクサク開発する際の現時点でのプラクティス

*後で書き加えるかもしれませんが、とりあえず投稿しておきます*

Google Apps Script (以降 GAS) で Google スプレッドシートにアクセスする WEB API を作ったりしているわけですが、その際にサクサク開発するためにやっていることを書いておこうと思います。
Qiita への投稿自体が初めてなもので、そういう点でもアドバイスなどありましたらよろしくお願いします。

#概要
Google スプレッドシートとか便利で GAS のスクリプトも「ウエブアプリケーションとして導入」できるので、それ（Google スプレッドシート）にアクセスする WEB API もお手軽に作れるわけですが、普通にやっていてもなかなかサクサク開発できないので、いろいろ試行錯誤して今はこんな感じでやっています。

## 不満と要望とそれへの対処

###GAS のデフォルトのエディタ (ブラウザベース) も悪くないけど、あれやこれが ...
GAS 開発全体に言えますが、好きなエディタを使ったりとか、VCS を使いたかったりとか、コードはローカルでいじりたいので、[gas-manager](https://github.com/soundTricker/gas-manager) を利用させてもらっています。

###gas-manager 使うのはいいけど、構文エラーで upload 失敗しても理由がよくわからない ...
これもウェブアプリケーションに関係なく、(gas-manager の問題でもなく) GAS の import 機能についてまわる問題ですが、import の失敗の理由がわからないのですよね。
なので、適宜 [jshint](http://jshint.com/) でチェックするようにしています。gas-manager も jshint も npm で入るのでいいですね。ついでに [YUIDoc](http://yui.github.io/yuidoc/) も入れていて、`./jh.sh` で jshint が `./jd.sh` で YUIDoc が gas 開発ディレクトリ以下全部のソースに対してかけられるようにしています、というのは余談です。

###コードの変更を「ウェブアプリケーション」に反映するにはブラウザから新しい「版」を作らないといけないなんて ...
やっと本題です。
GAS のコードを WEB API にするには「ウェブアプリケーションとして導入」するわけですが、その際にはプロジェクトの「版」を指定しなければなりません。しかし、「ウェブアプリケーションとして導入」する手続きも、新しい「版」の作成も、今のところブラウザから操作するしかな（いらし）く、サクサク感がありません。
そこで、ライブラリを「デベロッパーモード」でリンクしておくと、指定した「版」に関係なく、ライブラリの最新のコードが使われる、というのを利用します。
一つの「ウェブアプリケーション」を作る際に【表】と【裏】の二つにプロジェクトに分けます。【表】はウェブアプリケーションとしてリクエストを受けますが、実処理は【裏】に丸投げする、そういう構造です。

#具体的な方法
`freon` という仮想の WEB API 作成を例に具体的な方法を書いておきます。そのうち、スクリーンショットも載せるとよさげですね。

##【裏】プロジェクトの作成
まず、【裏】プロジェクトを作ります。私は「フロン（裏）」とかいう名前にするようにしています。で、そこに `freonBack.gs` を作ります（というか、元の「コード.gs」をリネームします）。

```javascript:freonBack.gs
function callapi(e, type) {
  return matome.WebAPI(e, type).init({
    name: 'freon',
    actions: {
      greet: function() {
        var date = this.parameter.date;
        ...
      },
      ...
    }
  }).exec();
}
```
`matome.WebAPI()` ってのは WEB API のフレームワーク的なオレオレクラスなので詳細はおいておきますが、要は `freonBack.gs` のようにしておくと、query string に "`?action=greet&date=20150108`" と書いておくと `greet` のとこの関数が実行されて、`this.parameter.date` とかで値が取れますよ的なものです。
ここで重要なのはグローバルに関数 `callapi()` を定義しちゃうということです。 
そして新しい「版」を作り、ライブラリ化します。新しい「版」を作るときには `callapi()` の中身が空の状態でも無問題です。

##【表】プロジェクトの作成
【表】プロジェクトを作ります。私は「フロン（表）」とかいう名前にするようにしています。で、そこに `freonFront.gs` を作ります（というか、元の「コード.gs」を ... 以下略）。
そして【裏】のライブラリを「デベロッパーモード」ON でリンクします。名前は `freon` にでもしておきます。
コードはこれだけ。

```javascript:freonFront.gs
function doGet(e) { return freon.callapi(e, 'get'); }
function doPost(e) { return freon.callapi(e, 'post'); }
```

##gas-manager の設定
gas-manager のプロジェクト設定ファイル `gas-project.json` には次のように書いておきます（windows 上で開発しているのがばれますね）。

```json:gas-project.json
  "freon": {
    "fileId": "1Vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx03d",
    "files": {
      "freonBack": {
        "path": "c:\\Users\\takeyuki\\home\\gas\\src\\freongas\\freonBack.js",
        "type": "server_js"
      }
    }
  },
  "freonFront": {
    "fileId": "1Vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx04e",
    "files": {
      "freonFront": {
        "path": "c:\\Users\\takeyuki\\home\\gas\\src\\freongas\\freonFront.js",
        "type": "server_js"
      }
    }
  },
```
VCS で管理するときのことなどを考慮し、【表】のコードも【裏】のコードも同じディレクトリに置いておくわけです。基本、【表】のコードは変更しないので、gas-manager に設定を書いておく必要もないのですが。

##あとはガシガシ開発
あとはローカルで開発して、適宜

```shell-session
$ gas upload -e freon
```
でサーバに上げるだけです。たまに `download` もしますけどね。