LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

Friday, May 24, 2019

LiveChatのイベントログをシートに書き出したい


LiveChatでチャット終了後のタグ更新をwebhookでキャッチしたい
の改良版です。


イベントのログを残したい

Logger.logでは複数のログの記録を残せなくて
console.logでのStackdriver LoggingでGCPのプロジェクトと関連付ける程でもなくて

軽くログを見たいだけなのでSpreadsheetに書き出すようにしてみます
一行目は見出しを入れておきます



LiveChat側でWebhookの設定をして
以下のコード.gsの シートのURL を各自で使うものに変更すると
チャット開始、タグの更新、チャット終了のタイミングでシートにログが書き込まれます



コード.gs
function doPost(e) {
  var contents = e.postData.contents
  var jobj = JSON.parse(contents);
  var eventType = jobj['event_type'];
  var isEnded = judgeEnded(jobj);
  
  var message;
  switch(eventType) {
    case 'chat_started':
      message = 'not ended';
      break;
    case 'chat_changed':
      if(isEnded) {
        message = 'ended & changed';
      } else {
        message = 'not ended';
      }
      break;
    case 'chat_ended':
        message = 'ended';
      break;
  }
  
  var datetime = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm:ss:SSS');

  var values = [eventType, message, contents, datetime];
  set_values(values);
}

function judgeEnded(jobj) {
  var events = jobj['chat']['events'];
  if(events === undefined || events[0] === undefined) {
    return false;
  }
  return true;
}

function set_values(array){
  var ss = SpreadsheetApp.openByUrl("シートURL");
  var sh = ss.getSheets()[0];
  var last_row = sh.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = 1;
  var num_cols = array.length;
  var range = sh.getRange(start_row, start_col, 1, num_cols);
  range.setValues([array]); 
}

意訳
この機能がやること
飛んできたデータからcontentsを取得して
オブジェクトに変換して
event_typeを取得して
chatが終わっているか判定して

messageの入れ物を用意して
eventTypeによって分岐させる
chat_startedなら
 messageにnot endedを入れる
 switchの判定から抜ける
chat_changedで
 chatが終わっているなら
  messageにended & changedを入れる
 終わっていないなら
  messageにnot endedを入れる

 switchの判定から抜ける
chat_endedなら
 messageにendedを入れる
 switchの判定から抜ける


現在日時を取得してフォーマットして

配列にeventType, message, contents, datetimeを入れて
set_valuesに渡す


この機能がやること
chatのeventsを取得して
もしeventsが存在しないかeventsの0番目が存在しなければ
falseを返す

存在していればtrueを返す


この機能がやること
スプレッドシートを取得して
0番目のシートを取得して
値が入っている最終行を取得して
その行数に1足して
1列目から
1行だけ
配列の要素の列数
の範囲を取得して
その行に値を入れる シートは2次元配列なので[[1列目の値,2列目の値,3列目の値]]という形にする




関連記事

LiveChatでチャット終了後のタグ更新をwebhookでキャッチしたい


参考

Building webhook integration
https://developers.livechatinc.com/docs/build-integration/

Latest post

Google Apps Scriptでスライドのページを指定して複数の図形を追加したい(Google Apps Script)

Googleスライドのページを指定して、 複数の図形(とテキスト)を追加したくて書いたコードです。 Code.gs const values = [ "hello" , "hey" , "hi" ]; con...