LINE WORKSボットへのメッセージをGoogle Spreadsheetだけで受ける

先日、こんな記事を拝見しました。

"Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法"
https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3

ちょうど LINE WORKS の Bot を説明するのに使いやすいネタだったので、json の parse 処理を少し改変して Spreadsheet だけでBotへの返信を受けるようにしてみました。

#事前準備
Google アカウント
LINE WORKS アカウント (プランは何でもOK。トライアルでも可)

#手順
## 1. Google スプレッドシートを作成する
名前は何でも OKです。とりあえずスクリプト空欄のままスクリプトエディタを開きます。
![スクリーンショット 2018-03-26 16.51.47.png](https://qiita-image-store.s3.amazonaws.com/0/224481/50e7b618-e909-bec0-8e71-5bba97b39e33.png)
続いて、先の記事を参考に LINE WORKS の Bot メッセージに合わせて json のパース部分を少しアレンジします。

```callback.gs
// POSTリクエストに対する処理
function doPost(e) {
  // JSONをパース
  if (e == null || e.postData == null || e.postData.contents == null) {
    return;
  }
  var requestJSON = e.postData.contents;
  var requestObj = JSON.parse(requestJSON);
  
  //  
  // 結果をスプレッドシートに追記
  //

  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getActiveSheet();

  // ヘッダ行を取得
  var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];

  // ヘッダに対応するデータを取得
  var values = [];
  for (i in headers){
    var header = headers[i];
    var val = "";
    switch(header) {
      case "date":
        val = new Date();
        break;
      // ID を返す
      case "accountId":
        val = requestObj.source[header];
        break;
      // メッセージ形式を返す
      case "messageType":
        val = requestObj.type;
        break;
      // その他の場合、content の中の指定の値を返す
      default:
        val = requestObj.content[header];
        break;
    }
    values.push(val);
  }

  // 行を追加
  sheet.appendRow(values);
}
```

これで、1行目のタイトル行に合わせて Bot の受信メッセージをパースする準備が整いました。
1行目はこんな感じで書くと良いと思います。

| date | messageType | accountId | type | text | postback | location |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|

最後に、これをウェブアプリケーションとして導入します。実行権限は自分のアカウント、アプリケーションにアクセスできるユーザーは「全員(匿名ユーザーを含む)」として作成してください。
![1803261704.png](https://qiita-image-store.s3.amazonaws.com/0/224481/236a0787-2cb1-8b1c-5e88-75a26ae36d9e.png)
生成されたウェブアプリケーションの URL をコピーしておきます。

##2. LINE WORKS Developer Console にログインし、Bot を作成する
LINE WORKS の管理者アカウントで LNE WORKS Developers にログインします。
https://developers.worksmobile.com/jp/
[Bot]メニューから[登録]を選び、適当な名前で Bot を作成します。
![スクリーンショット 2018-03-26 17.06.19.png](https://qiita-image-store.s3.amazonaws.com/0/224481/67b6b5ec-090f-bcd9-b2ef-e4bb334f02ea.png)
Callback URL に先ほどの URL を設定します。送信可能なメッセージタイプのテキストと位置情報にチェックを入れます。残りの項目は適当に設定すれば OK です。

##3. Bot を公開する
今度は LINE WORKS 管理画面にログインし、[サービス]-[Bot]から[追加]を選び、先ほど作成したBot　をテナントに追加します。あとは設定を[公開]に変えれば全てのメンバーに Bot が使えるようになります。

##4. 送信テストしてみる
LINE WORKS アプリケーションからサンプルで作成した Bot にテキストメッセージを送ると、以下のように記録されていくのが確認できるかと思います。

| date | messageType | accountId | type | text | postback | location |
|:--|:--|:--|:--|:--|:--|:--|
| 2018/03/23 11:25:52 | message | demo@example | text | バッチリでした | undefined | undefined |

###4.1 固定メニューと組み合わせる
例えば下図のように固定メニューと組み合わせると、単純な作業ログツールにもなります。
![IMG_2800.PNG](https://qiita-image-store.s3.amazonaws.com/0/224481/b5d2db45-f256-a0d3-6df0-3cb87ccca414.png)
固定メニューを使うと、キーボードを変更して指定した定型文をメニューから選んで送信させることができます。
https://developers.worksmobile.com/jp/document/5#
これを使うことで、この表のような記録を簡単に取ることができます。
![スクリーンショット 2018-03-26 18.37.42.png](https://qiita-image-store.s3.amazonaws.com/0/224481/cd611de8-2173-a330-5419-75a4e20ce515.png)


#おわりに
今回はとりあえず受信メッセージを記録するだけのシンプルなものを作ってみました。
メッセージ受信時に Bot から返信する部分については、認証まわりの対応が必要なのでまたの気が向いたときにでも書きたいと思います。