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

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

[Slackで「分報」を導入したらめっちゃ作業効率があがった](https://note.mu/reoleo/n/n102308f5b4e3)
[Slackで簡単に「日報」ならぬ「分報」をチームで実現する3ステップ〜Problemが10分で解決するチャットを作ろう
](http://c16e.com/1511101558/)

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

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

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

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

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

# 参考
* [Toggl API](https://github.com/toggl/toggl_api_docs/blob/master/toggl_api.md)
* [GASのドキュメント](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object))
* [Slack API](https://api.slack.com/apps)

# 下準備
1. [スプレッドシート](https://docs.google.com/spreadsheets/d/1Vgo4C-gyNc_CsrSjZIcFbRrLPIduiVHvguov2SFUmpg/edit#gid=1557260643) このスプレッドシートをコピーして使ってください。（このカラムの順番にデータが書き込まれるので）
2. SlackでAPIの準備（WebhookでOK）
3. TogglからAPIキーの取得

# コード
```javascript
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の方でトリガーとか設定すれば大丈夫です。

<img width="307" alt="Screen Shot 2019-01-27 at 19.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/75102/3417e5c4-a91b-8c80-bcaf-4dfa0e3df702.png">
こんな感じの通知がSlackに流れ込んできました。

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

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

[ツイッター](http://bit.ly/2PkyJHK)もやっているのでお友達になっていただけると嬉しいです。
こちらからは以上です。