テレワークに活躍!「Toggl」で行ったタスクをSlackで共有しよう

ブログメインビジュアル こんにちは、フロントエンドエンジニアの峯です。
今回は、前回の「祝日対応Slackボットを作る!」に引き続き、Slack Botを作成します。
時間管理ツールの「Toggl」APIを使って、タスク情報を取得してSlackに昨日実施タスクを投稿してくれるBotを作成します。

テレワークで仕事をこなしていると、こんな事はないでしょうか?

  • 自分が担当しているタスクをチームに共有することが難しい

そんな時に!Slackにメンバーのタスクが共有されてくれば、多少の双方の環境は改善するのではないでしょうか。
是非、参考にしてみて下さい。

目次

ポイント

今回は、毎朝、前日のタスク一覧を投稿するBotを作成します。
ご都合に合わせてアレンジしてみて下さい。

  • 個人の識別を可能にする(Botアイコン、Bot名を個別に設定)
  • 前日のタスクのみまとめて投稿

準備

Toggl API Tokenを準備

  • プロフィールページにアクセスして、(toggl.com/app/profile)ページ下部より、API Tokenを用意します。 TogglのAPI Tokenの項目

「Incomin Webhook」アプリの有効化

  • 前回の記事を参考にしてアプリを有効化して、Webhook URLを準備して下さい。

GASでスクリプト作成

GASの新しいプロジェクトを作成して、プログラムを書いていきます。


Slack投稿メソッド

まずは、Slackに投稿する処理です。
投稿する際のアイコンと、Bot名をアカウント別に変更して識別したいので、引数として、「ユーザー情報」と「投稿テキスト」を受け取ります。

// Slackに投稿するためのAPIリクエスト
var Slack = {
  /**
  ** info - Toggl APIから取得したユーザー情報
  ** message - 投稿テキスト(タスク一覧文字列)
  */
  post: function(info, message){
    var url = '{webhook URLを貼り付ける}';
    var payload = {
      icon_url: info.image_url, // Togglに設定中のアイコンイメージをBotアイコンに設定
      username: info.fullname,  // Togglに設定中のアカウント名をBot名に設定
      text: message
    };
    var options = {
      'method': 'POST',
      'contentType': 'application/json',
      'payload': JSON.stringify(payload)
    }
    var response = UrlFetchApp.fetch(url, options);
    return response;
  },
}


Toggl API のリクエストメソッド

Togglの情報を取得するためのメソッドです。
今回利用するAPIは3つです。

  • /time_entries - タスクの一覧を取得します。
  • /projects/{id} - タスクで取得するプロジェクトidからプロジェクト名を取得します。
  • /me - アイコン、アカウント名などのアカウント情報を取得します。
// Toggl APIにアクセスするための各種エンドポイント
var Toggl = {
  // 自身のTokenに書き換えて下さい。
  BASIC_AUTH: '{TogglのAPI Tokenを貼り付ける}:api_token',

  get: function(path){
    var url = 'https://www.toggl.com/api/v8' + path;
    var options = {
      'method' : 'GET',
      'headers': {"Authorization" : "Basic " + Utilities.base64Encode(this.BASIC_AUTH)}
    }
    var response = UrlFetchApp.fetch(url, options);
    return JSON.parse(response);
  },
  getTimeEntries: function(){
    var path = '/time_entries'
    return this.get(path)
  },
  getProject: function(id) {
    var path = '/projects/' + id
    return this.get(path);
  },
  getMe: function() {
    var path = '/me'
    return this.get(path)
  }
}

投稿作成メソッド

/time_entries APIで取得したタスク情報を一つずつチェックして、前日のタスクのみを抽出してSlack投稿用のレイアウトに変換します。

// 日付レイアウトの変換メソッド
function dateStyle(date, format) {
    format = format.replace(/YYYY/, date.getFullYear());
    format = format.replace(/MM/, date.getMonth() + 1);
    format = format.replace(/DD/, date.getDate());

    return format;
}

// 実行メソッド
function main() {
  var now = new Date();
  var yesterday = dateStyle(new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1), 'YYYY/MM/DD'); //昨日の日付を整形して取得
  var timeEntries = Toggl.getTimeEntries();
  var info = Toggl.getMe().data // アカウント情報を取得
  var data = []; // Slackに投稿するためのタスクをストックする変数

  // タスク一覧を一つずつ配列にpush
  for(let i=0; i<timeEntries.length; i++) {
    var timeEntry = timeEntries[i]; // タスク一覧から一つずつ取得
    // タスクのプロジェクトidからプロジェクト名を取得ない場合は、エラーになるので、else処理を用意
    var projectName = 'pid' in timeEntry ? Toggl.getProject(timeEntry.pid).data.name : 'No Project';
    var targetEntryDate = timeEntry.start.substr(0,10).split('-'); // タスクの日付をして取得
    var entryStart = dateStyle(new Date(targetEntryDate[0], targetEntryDate[1] - 1, targetEntryDate[2]), 'YYYY/MM/DD') // タスクの日付レイアウト整形

    if(i===0) {
      // 日付の情報は一つでいいので、一度だけpush
      data.push('*' + yesterday + 'のレポート*')
    }
    if(entryStart === yesterday) {
      // 昨日のタスクだけpush(投稿イメージ:【プロジェクト名】タスク名 40分)
      data.push('【' + projectName + '】 *' + timeEntry.description + '* ' + Math.round(timeEntry.duration/60/60*60) + '分')
    }
  }
  // Slackに投稿 昨日のタスクが配列で溜まっているので、改行コードでjoinしてまとめてSlackにPOSTします。
  Slack.post(info, data.join('\n'))
}

以上でスクリプトは完了です。
後は、GASのトリガーを設定して、設定日時にmainを実行するします。


どうでしょうか?環境に合わせて当日のタスクや、期間を絞ったタスクの取得も可能です。
Botアイコンや、Bot名前を設定することで、複数人の投稿でも識別がしやすくなると思います。

さいごに

上記のスクリプトは、個々のTokenに依存しているため、個別にスクリプトの生成が必要になります。
Togglのworkspace内のアカウント情報を取得するともっと広範囲で活用できそうです。
そこまでできるようになったら、また改めて紹介したいと思います。


これまでと比べて、不便に感じることが多い状況ではありますが、各業界のスペシャリスト等が、有意義なサービスをリリースしています。
きっとあなたの環境を改善できるサービスもあると思います。
そして、この記事もその一つになれば幸いです。


最後まで読んで頂きありがとうございます。

この記事を書いた人 mine 2019年1月 中途入社のゴルフにはまっているフロントエンドエンジニア
COBOL開発経験がありますが平成生まれです。
TOP