LINEWORKS BOT とのやり取りを Google スプレッドシートに残す

前回の記事「 [GoogleAppsScript で LINEWORKS のチャット BOT を作る](https://qiita.com/kunihiros/items/a94221ad7c9f4de84cf8)」の続きです。
今回は、BOT 話しかけられた内容を Google スプレッドシートにログとして残す方法を解説していきます。

#まずは前回のコードを確認

事前準備やら何やらは前の記事を参照にしてくださいね。
以下、前回の完成コードです。

```js
function doPost(e) {
  if (e == null || e.postData == null || e.postData.contents == null) return;
  var requestJSON = e.postData.contents;
  var requestObj = JSON.parse(requestJSON);
  var sendMsg = requestObj.content.text; // 応答メッセージ（今回はオウム返し）

  // LINEWORKS にメッセージを送信
  LINEWORKS.sendMsg(setOptions(), requestObj.source.accountId, sendMsg);
}

function setOptions(){
  return {
    "apiId" : "API ID",
    "consumerKey" : "Server API Consumer Key",
    "serverId" : "Server List(ID登録タイプ) の ID",
    "privateKey" : "Server List(ID登録タイプ) の認証キー",
    "botNo" : "botNo"
  };
}
```
これに少しだけコードを書き加えて、Google スプレッドシートにログを残せるようにします。

#取り合えずいいから動かしたい

例によって解説はいいから取り合えず動かしたいって人は、以下のコードを丸っとコピペしてください。

```js
function doPost(e) {
  if (e == null || e.postData == null || e.postData.contents == null) return;
  var requestJSON = e.postData.contents;
  var requestObj = JSON.parse(requestJSON);
  var sendMsg = requestObj.content.text; // 応答メッセージ（今回はオウム返し）

  // Google スプレッドシートにログを記載
  LINEWORKS.setLog(requestObj);

  // LINEWORKS にメッセージを送信
  LINEWORKS.sendMsg(setOptions(), requestObj.source.accountId, sendMsg);
}

function setOptions(){
  return {
    "apiId" : "API ID",
    "consumerKey" : "Server API Consumer Key",
    "serverId" : "Server List(ID登録タイプ) の ID",
    "privateKey" : "Server List(ID登録タイプ) の認証キー",
    "botNo" : "botNo"
  };
}
```

LINEWORKS ライブラリにログを記録する function `setLog()` を追加しといたので、たった一行追加するだけで OK です！

GoogleAppsScript の画面で「リソース」-「ライブラリ」をクリックし、バージョンを最新のものにすれば準備 OK です！
（まだライブラリの登録していない方は [こちら](https://qiita.com/kunihiros/items/a94221ad7c9f4de84cf8) を参照の上、ライブラリの登録をしてから動かしてください）

さくさくっといきますよー！

###デプロイして動作確認しよう

デプロイできたら、さっそく BOT に話しかけてみましょう

![1552965506.png](https://qiita-image-store.s3.amazonaws.com/0/363367/048aedee-3517-1e82-11aa-95aa0a53c6e7.png)

オウム返しで返事がきましたね。
Google スプレッドシートはどうなっているでしょうか。

![1553481897.png](https://qiita-image-store.s3.amazonaws.com/0/363367/5f047c38-cd10-bdd7-d9c0-17e5219c7d5c.png)

ログが残ってますね！成功です。
これで、いつ、誰からどんなメッセージが来たのか記録することができます。
簡単でしたねー。

#function setLog() の解説

と、言っても今回はさほど難しいことはしてません。
Google スプレッドシートに記載するだけなら、実はたった２行で済みます。

###1行目　Google スプレッドシートの取得

Google スプレッドシートを操作するには、どのシートを使用するか指定する必要があります。
今回はシートは１つなので、アクティブなシートを指定して取得し、変数に入れます。

```js
  // Google スプレッドシートを取得
  var sheet = SpreadsheetApp.getActive().getActiveSheet();
```

###2行目　受信メッセージをシートに記録

受信したメッセージは `requestObj` の中にあります。
アカウント情報等も全部この中に入っているので、`requestObj` の中身をシートに記載すればいいだけなのです。

```js
  // 受信メッセージを記録
  sheet.appendRow([requestObj]);
```

この２行を追加するだけでトーク内容がシートに記載されていきます。

![1552965418.png](https://qiita-image-store.s3.amazonaws.com/0/363367/a2e9c1d0-0d30-531e-be6b-0a8e8b66e9d6.png)

余談ですが、GoogleAppsScript はログ用に Logger.log() というメソッドがあります。
ですが、これ、実行の度にログが上書きされてしまうので、過去の比較とかができないんですよね。
なので、私はログを残すときにも Google スプレッドシートを使っています。
レスポンス内容とかを見るときにも便利ですよ。


#ログを見やすくする

ログは確かに残せましたが、あのままだと見辛いですよね。
せっかくスプレッドシートに残してるんだから、項目ごとに列を分けたいものです。

以下のようにコードの内容を書き変えます。

```js
function doPost(e) {
  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 = SpreadsheetApp.getActive().getActiveSheet();
  
  // 受信メッセージの分類とヘッダ行の挿入
  var headers = ["date", "messageType", "accountId", "text"];
  if(sheet.getLastColumn() === 0){
    sheet.appendRow(headers);
  }
  
  // 受信メッセージを項目ごとに分ける
  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);

  // 応答メッセージ
  LINEWORKS.sendMsg(setOptions(), requestObj.source.accountId, requestObj.content.text);
}

function setOptions(){
  return {
    "apiId" : "API ID",
    "consumerKey" : "Server API Consumer Key",
    "serverId" : "Server List(ID登録タイプ) の ID",
    "privateKey" : "Server List(ID登録タイプ) の認証キー",
    "botNo" : "botNo"
  };
}
```

デプロイして、BOT に話しかけると、こうなります。

![1552982568.png](https://qiita-image-store.s3.amazonaws.com/0/363367/b7659308-2b5f-17c8-de05-9a6643bf7833.png)

見やすいですね！
ちゃんとログデータって感じがしますよねー♪（謎）

これを簡単に扱えるようにしたのが、`LINEWORKS.setLog()` です。
上記コードでも、ライブラリでも、使いやすい方をお使いください。

#おわりに

今回もお付き合いいただき、ありがとうございました。
前回、質問があったので続編作ってみました。
スプレッドシートの他にもフォームやらサイトやら、色々と連携できるので、勉強しつつ記事に残していけたらと思っています。

次は何をやろうかな～。
ではまた！(^^)/

#参考にさせていただきましたm(_ _)m

[GoogleAppsScript 公式サイト](https://developers.google.com/apps-script/reference/)
[LINE WORKSボットへのメッセージをGoogle Spreadsheetだけで受ける](https://qiita.com/KIchiyanagi/items/bce6c260686f8b930eda)