17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

時間管理ツール【Toggl】を【GAS】と連携して【Slack】に分報を通知してみた。

Last updated at Posted at 2019-01-27

最近 「分報」 なるものが流行っているようです。(調べたら全然最近じゃなかった)

Slackで「分報」を導入したらめっちゃ作業効率があがった
Slackで簡単に「日報」ならぬ「分報」をチームで実現する3ステップ〜Problemが10分で解決するチャットを作ろう

僕もそんな時代の潮流に乗るべく分報なるものを実践してみたのですが、

「これめんどくさくない?」

いちいち作業した後にコメントするのなんて忘れちゃいます。

でも自分の作業を記録するのにはかなり賛成で、今からやる作業の時間を測ると謎の競争心によりセルフ・タイムアタックが始まります。
結果的に早く終わるのでこれはやりたい。

そのためにTogglを使い始めたのですが、これを分報にしちゃいたいということでGASで作ってみました。(Zapierで連携できるのですが月100件までの制限付きなので自分で作るつくる)

参考

下準備

  1. スプレッドシート このスプレッドシートをコピーして使ってください。(このカラムの順番にデータが書き込まれるので)
  2. SlackでAPIの準備(WebhookでOK)
  3. TogglからAPIキーの取得

コード

var Toggl = {
  BASIC_AUTH: '【ご自身のAPIキー】: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)
  },
  getTimeEntry: function(id) {
    var path = '/time_entries/' + id
    return this.get(path);
  },
  getProject: function(id) {
    var path = '/projects/' + id
    return this.get(path);
  }
}

var Slack = {  
  post: function(message){
    var url = '【ご自身で作ったAPIのURL】';
    var options = {
      'method': 'POST',
      'contentType': 'application/json',
      'payload': JSON.stringify({'text': message})
    }
    var response = UrlFetchApp.fetch(url, options);
    return response;
  },
}

function main() {
  var togglLogSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TogglLog");
  var timeEntries = Toggl.getTimeEntries();
  var lastTimeEntryId = togglLogSheet.getRange(1,1).getValue();
  
  for(var i in timeEntries) {
    var timeEntry = timeEntries[i];

    if(timeEntry.id <= lastTimeEntryId) {
      continue;
    }
    if(timeEntry.duration < 0) {
      continue;
    }

    lastTimeEntryId = timeEntry.id
    var projectName = Toggl.getProject(timeEntry.pid).data.name
    var data = []
    togglLogSheet.getRange(togglLogSheet.getLastRow() + 1, 1, 1, togglLogSheet.getLastColumn())
      .setValues([[timeEntry.id, projectName, timeEntry.description, timeEntry.duration, new Date(timeEntry.start), new Date(timeEntry.stop)]]);
    Slack.post(formatText(projectName, timeEntry))
  }
  togglLogSheet.getRange(1,1).setValue(lastTimeEntryId);
}

function formatText(projectName, timeEntry) {
  return '' + projectName + '】 *' + timeEntry.description + '* :' + Math.round(timeEntry.duration/60/60*100)/100 + '時間'
}

後半なんか疲れちゃったので死ぬほど変な部分あると思いますがとりあえず動くと思います。(たぶん)
あとはGASの方でトリガーとか設定すれば大丈夫です。

Screen Shot 2019-01-27 at 19.25.22.png こんな感じの通知がSlackに流れ込んできました。

スプレッドシートに書き込むようにしたのは色々分析したかったからです。(Togglに綺麗なダッシュボードありますけど)

※ 1行目1列目のIDが最後のTimeEntryのIDで、そこをみて新規のTimeEntryかどうかを判断しています。

ツイッターもやっているのでお友達になっていただけると嬉しいです。
こちらからは以上です。

17
15
2

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
17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?