LoginSignup
11
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-25

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

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

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

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 スプレッドシートにログを残せるようにします。

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

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

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 です!
(まだライブラリの登録していない方は こちら を参照の上、ライブラリの登録をしてから動かしてください)

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

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

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

1552965506.png

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

1553481897.png

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

function setLog() の解説

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

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

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

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

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

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

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

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

1552965418.png

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

ログを見やすくする

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

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

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

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

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

おわりに

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

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

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

GoogleAppsScript 公式サイト
LINE WORKSボットへのメッセージをGoogle Spreadsheetだけで受ける

11
9
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9