2020/12/14エンジニア

    [Chatwork,GAS] Chatworkからデータを集計する

    Category: Chatwork, GAS

    Chatwork APIとGASを使って利用者に負担を少なくデータを集計する

    執筆者 / N.H.

    はじめに

    業務で使っているチャットツールといえばSlackやChatwork、Microsoft Teams等、多様にあると思いますが弊社ではChatworkを主に利用しています。テレワークが増えた昨今、出勤時や退勤時に業務報告をチャットで記入している方々も多いと思いますが、毎日のチャットの中で流れて行ってしまい、統計的に作業者達の作業状況を把握したい。という要望が上がってきました。そこでChatwork APIとGASを使い、それらを集計しておくシステムを現在開発中です。まだシステム自体は作成途中ですが、方法の共有として記事にしようと思います。

    この記事の内容

    1. 準備

    • Chatwork APIの設定
    • GASの使い方

    2. ChatworkからGASにデータを集計する

    1. 準備

    今回必要な準備は2つです。それぞれ無料で利用できます。

    • Chatwork APIの申請
    • GAS

    ・Chatwork APIの申請

    Chatwork APIとは?

    Chatwork APIは、外部のプログラムから簡単に使用できたり、Chatworkで発生したイベントを外部のプログラムに提供することができます。これにより、以下のような連携が可能になります。

    • 自分宛てにメールがきたらChatworkにメッセージとして流す
    • サーバーエラーを検知し関係者にタスクを振る
    • カレンダーに予定が追加されたら、Chatworkでタスクを振る

    下記、URLよりChatwork APIドキュメントページに飛びます。利用申請はこちらから行いますし、Chatwork APIで行えることもすべてこのページ内に書いてあります。
    https://developer.chatwork.com/ja/

    申請後、API Tokenの発行ページになります。このAPI Tokenは後にGASでChatworkから情報を取得する際に利用します。どこかにメモしておきましょう。

    ・GAS

    GASとは?

    Google Apps Scriptの略です。「ガス」と読んでる方がほとんどだと思われます。JavaScriptをベースにしたスクリプト言語で自前で関数を作ったり、グラフを作ったり、Googleドキュメントやスプレッドシート等のGoogle各サービスの連携や自動化を行えたりします。外部APIを使い、他サービスからのデータを収集することも可能です。今回の場合、件数がそこまででもないのでスプレッドシートをDBに見立ててデータを収集します。

    利用方法としてはスプレッドシートを開いてもらい、上部メニューより[ツール]→[スクリプト エディタ]と選択してもらうのみです。

    シートに紐づく形で、このようにスクリプトエディタ画面が開きます。すべてウェブ上で行えるので、手軽で良いですね。(個人的にコード補完がイマイチなのでここでそのまま書くのは微妙な気もしてます。作業環境を変えたらそちらも記事にしたいと思います)

    GASのReferenceはこちらになります。

    https://developers.google.com/apps-script/reference

    2.実際にデータを収集してみる

    とりあえず動かしてみましょう。

    チャットワークでルームを作成し下記のようにチャットを記入しておきます。

    【出勤】

    タスク:GASで実装

    進捗:0/100

    「集計データ」という名前でシートを作成し、以下をGASのスクリプトエディタにコピペして実行してみてください。

    function recordTime(){

      var wsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“集計データ”); //予め作成したシートを指定
      
      var params = {
        headers : {“X-ChatWorkToken” : ‘準備でメモっておいたAPI Token’}, //チャットワークAPIトークン
        method : “get”
      };
      var roomID = XXXXXXXX; //管理者権限のあるチャットルームで設定から確認できるID
      var url = “https://api.chatwork.com/v2/rooms/” + roomID + “/messages?force=1”; //指定のグループチャットからメッセージを取得
      
      // 記述の簡略化のために関数化、後に登場
      const fetchData = (str, pre) => {
        const reg = new RegExp(pre + ‘.*’);
        if (str.match(reg) != null) {
          const data = str.match(reg)[0].replace(pre, ”);
          return data;
        } else {
          return ”;
        }
      };
      
      try {
        var respons = UrlFetchApp.fetch(url, params).getContentText(); //チャットワークAPIエンドポイントからレスポンスを取得
        var json = JSON.parse(respons); //文字列をJSON形式として解析しJSONオブジェクトとして返す
        
        json.forEach (function(obj) {
          
          var date = new Date(obj.send_time*1000);
          var date_D = new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0); //日付を取り出す
          
          // 条件に合うデータをシートに挿入
          if (obj.body.match(/出勤/)) {
            wsData.appendRow(
              [
                “出勤”,
                obj.account.name,
                fetchData(obj.body, ‘タスク:’),
                fetchData(obj.body, ‘進捗:’),
                date_D
              ]
            );
          } else if (obj.body.match(/退勤/)) {
            wsData.appendRow(
              [
                “退勤”,
                obj.account.name,
                fetchData(obj.body, ‘タスク:’),
                fetchData(obj.body, ‘進捗:’),
                date_D
              ]
            );
          }
        });
      } catch(e) {

        Logger.log(‘エラーが発生しました’);
        Logger.log(e.message);
      }
    }

    スプレッドシートにChatworkから取得したデータが挿入されましたね?おめでとうございます!あとはChatwork APIとGASのReferenceを見ながら、必要なデータを収集して、整形していきましょう!

    注意点としては、スクリプト内にも書いてある通り、Chatwork API TokenとルームIDは自分で用意したものを使用してください。

    ・ハマりポイント1

    指定のグループチャットからメッセージを取得しているURLの箇所の

    /messages?force=1

    のforceに渡している引数が未取得のチャットなのか、全件なのか、等の指定になっています。このあたりのパラメータはChatwork APIドキュメントを参照しましょう。

    ・ハマりポイント2

    foreach文等の記述の仕方はjavascriptに準拠します。他の言語とは少し違う書き方なこともあるので適宜、調べてください。

    まとめ

    これで、「集計データ」シートにチャットワークからのデータが書き込まれたと思います。そのデータを元に、グラフ化できるように、データを整形し、必要な方に見てもらいます。例としては以下のようにグラフ出力が可能です。プロジェクトや職種、個人ごとに分けて見れたり、ボトルネックの発見に役立てられるようなグラフが出来たら良きですね。

    一応作業者の方々には、こちらの指定するチャットの書き方に変えてもらう必要がありますが、概ね、いままで通り、チャットに出退勤情報を入力するだけで上記の表が出来上がる、という寸法です。

    また、集計していくにあたって作成したスクリプトを定期的に実行する必要がありますが、GASにはタイマー実行という機能があるためGASのみで完結できます。

    どういったデータが必要か、どういったグラフだと見やすいかといったものは現場とのすり合わせにもなるので、今回は深く触れませんが、出来るだけ最初に完成形を明確にし、必要最低限なデータ収集を心がけましょう!以上となります。ご一読ありがとうございました。

    参考リンク

    ブログ一覧へ戻る