こんにちは、フロントエンドエンジニアの峯です。
今回は、前回の「祝日対応Slackボットを作る!」に引き続き、Slack Botを作成します。
時間管理ツールの「Toggl」APIを使って、タスク情報を取得してSlackに昨日実施タスクを投稿してくれるBotを作成します。
テレワークで仕事をこなしていると、こんな事はないでしょうか?
- 自分が担当しているタスクをチームに共有することが難しい
そんな時に!Slackにメンバーのタスクが共有されてくれば、多少の双方の環境は改善するのではないでしょうか。
是非、参考にしてみて下さい。
目次
ポイント
今回は、毎朝、前日のタスク一覧を投稿するBotを作成します。
ご都合に合わせてアレンジしてみて下さい。
- 個人の識別を可能にする(Botアイコン、Bot名を個別に設定)
- 前日のタスクのみまとめて投稿
準備
Toggl API Tokenを準備
- プロフィールページにアクセスして、(toggl.com/app/profile)ページ下部より、
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内のアカウント情報を取得するともっと広範囲で活用できそうです。
そこまでできるようになったら、また改めて紹介したいと思います。
これまでと比べて、不便に感じることが多い状況ではありますが、各業界のスペシャリスト等が、有意義なサービスをリリースしています。
きっとあなたの環境を改善できるサービスもあると思います。
そして、この記事もその一つになれば幸いです。
最後まで読んで頂きありがとうございます。