GoogleAppsScriptを使って無料で簡易APIを作成してみる

本記事は[KIT AppDeveloper Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kitappdeveloper)の6日目の記事です。

# APIを作ったことがなくて難しそうという方

実際にはLinuxサーバを立ち上げて、公開する設定やらセキュリティなど色々考えなければならないことが多いと思います。
チュートリアル形式の本記事流れにそって作成していくことで、難しいことを考えることなく、無料かつ簡単にAPIを作成できます。


# GoogleAppsScriptって何？

GoogleAppsScriptはGoogleSheets, Docs, Formsなどを使って、手軽にサーバサイドの環境を実行することができるサービスです。
詳しくは[公式](https://developers.google.com/apps-script/)を見てください。
本記事の内容自体は公式のドキュメントなどを見ずにできる内容になっています。


# 1. APIの作成

GoogleDriveにアクセスして、新規 > Googleスプレッドシート でスプレッドシートを作成し
スプレッドシート > ツール > スクリプトエディタ でGoogleAppsScriptが作成できます。
開くとコード.gsというのがすでに作成されていると思うので、そこに下記のサンプルコードをコピペします。

簡単にコードの説明をすると、POSTメソッドは`doPost()`, GETメソッドは`doGet()`がそれぞれ受け取ります。
・doPost( ): timestamp,contentというデータを受け取り、スプレッドシートへ書き込みます。
・doGet( ): POSTされた最新のtimestamp,contentをjson形式で表示します。

※ SHEET_IDはスプレッドシートのURL`https://docs.google.com/spreadsheets/d/xxx/edit#gid=0&vpid=A1`の`xxx`部分がIDになるので、自分の作成したものに置き換えてください。

```コード.gs
var SHEET_ID = "xxx";

// データ更新
function doPost(e) {
  var params = JSON.parse(e.postData.getDataAsString());
  var timestamp = params.timestamp;
  var content = params.content;

  var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("シート1");
  var sheetData  = sheet.getDataRange().getValues();
  sheetData.push([timestamp, content]);
  sheet.getRange(1,1,sheetData.length,2).setValues(sheetData);
  
  var result = {'response': 'sccess', 'data': {'timestamp': timestamp, 'content': content}};
  
  return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
}


// データ取得
function doGet(e) {  
  var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("シート1");
  var sheetData = sheet.getDataRange().getValues();
  
  var timestamp = String(sheet.getRange(sheet.getLastRow(),1,1,1).getValue());
  var content = sheet.getRange(sheet.getLastRow(),2,1,1).getValue();
  
  var result = {'timestamp': timestamp, 'content': content};
  
  return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
}
```

# 2. APIの公開

先ほどサンプルコードを貼ったGoogleAppsScriptの公開 > ウェブアプリケーションとして導入をクリックし
・プロジェクトのバージョン: 新規作成
・アプリケーションにアクセスできるユーザー: 全員（匿名ユーザを含む）
と変更して「更新」を押します。
（初めての場合、許可するかどうか聞かれると思うので許可してください。）

すると、公開したURLが表示されると思うのでコピーしておいてください。
（再度、ウェブアプリケーションとして導入をクリックすることで、現在の公開URLを取得することもできます。）


# 3. APIの動作確認

今回はサンプルなのでコマンドラインからcurlを使ってAPIにGET,POSTで動作を確認します。

#### 3-1. POST

下記のcurlコマンドでURLに対してDATAをPOSTします。

* URL: 公開したURL
* DATA: {timestamp: 現在時刻, content: "hoge"}

```
# `data "+%s"`で現在のUNIXタイムを取得することができます。
curl -X POST -d "timestamp="`date "+%s"`"&content=hoge" 公開したURL
```

するとスプレッドシートにデータが反映されていると思います。
<img width="338" alt="スクリーンショット 2015-12-06 0.33.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/42327/f844dff1-30e7-fb8c-7161-18c58ff9c9b5.png">

このように手書きで一行目のセルにデータのラベルを書いておくと、データの内容が何なのか分かりやすくなります。
<img width="340" alt="スクリーンショット 2015-12-06 0.34.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/42327/b878ef3b-24b1-321e-9cf5-249020593150.png">



#### 3-2. GET

下記のcurlコマンドでURLに対してGETします。

* URL: 公開したURL

```
curl -L -X GET 公開したURL
```

すると、先ほどPOSTしたデータを取得することができます。

```
{"timestamp":"1449326663","content":"fuga"}
```

また、GETはウェブブラウザで公開したURLを開くことでも確認できます。

# 最後に。

実際に作成できたでしょうか？
簡易的なAPIなら、このように無料かつ簡単に作成することができます。
実際にある程度の規模になるとこのAPI作成方法では間に合わなくなりますが、個人アプリやサービスで試すぐらいなら問題なく動作すると思います。
ぜひ、サービス内で完結するだけではなくAPIなど外部と連携したものを作ってみましょう！