あまりにも作業中に他に意識が散ってしまうので Toggl を使って今やっている作業を可視化することにしている。やるぞ!と決めた内容が常に表示されていれば気が散っても戻れるはずだ。
Toggl で作業内容を可視化する
基本的にはデスクトップアプリで操作を行っている。作業前にこれから取りかかるタスクを書いて、スタートボタンを押す。作業が終わったらストップする。これだけでいつからいつまで作業できたか記録できるし、今なんの作業をしているかすぐに思い出せる。
記録したエントリは Toggl 上でもカレンダー形式で確認できる。ブラウザを開いていた時間も勝手に記録してくれているみたいだ。
Toggl のデータを Google Calendar に登録したい
ところで、普段のスケジュール管理は Notion Calendar で行っている。スケジュールの本体は Google Calendar にある。これからの予定もあのときに何やったのかもひとつのアプリ上で管理したい。
一応 Toggl にもカレンダー連携機能は存在している。ただし、外部カレンダーを Toggl にインポートするものしかない。Toggl をメインカレンダーで使っているなら良いが、前述の通り Google Calender 主体で使っているから、逆向きの連携をしたい。
自分と同じ要求のある人はそこそこいるようで IFTTT や Zapier にも Toggl → Google Calendar の連携はすでに存在していた。大昔に IFTTT を使っていたときはいろんな連携が無料だった気がするが、今は一部の連携は有料版のみだったり、上限を超えると有料になったりするみたいだ。機能は悪くないので課金することも考えたものの他では IFTTT を使っていないのでサブスク管理が増えるのもいやだなと思って躊躇した。
Google App Script で無料でできる
調べてみると Google App Script で同じことをやっている人がいた。結論からいうとコードを使わせていただくことにした。
このブログの内容にしたがってスクリプトを設定すると Toggl で作成したエントリが自動的に Google Calendar に連携される。
変更点1:更新頻度を10分にする
少し変更を加えた箇所もある。元のコードでは1日ごとにエクスポートすることになっているから、これを10分ごとに変更して GAS のトリガーも10分ごとのチェックになるようにした(watch を10分置きに実行するように指定)。今のところ Toggl API の上限にもかかっていないし、十分な間隔で使えている。
Toggl API は organization (free) 単位で600回、個人単位のリクエストは一定時間に30回までに定められている。10分ごとの実行であれば1日最大144回なのでレートリミットにはかからない計算。
変更点2:キャッシュ時間を変更する
元のスクリプトは前回の変更から現在時刻までの間に作成されて完了したエントリがカレンダーに登録されるようになっている。もし前回の変更の時間が記録されていなければその日の0時から現在時刻までのエントリを登録する。
前回の変更時間は Google App Script の CacheService を使って記録している。このキャッシュは最大で6時間までしか保存されないため、6時間の間に更新がないとその日の最初からエントリを登録してしまう(すでにカレンダーに登録したエントリを再度登録することになり、Toggl を使わないでいると6時間ごとにエントリが複製されることになる)。
この問題を解消するため、キャッシュがない場合は固定で6時間前の時刻を返すように変更して使っている。
// 6時間前の unix timestamp を返す関数を追加
function getBaselineTime() {
const now = Moment.moment().format('X');
const SIX_HOURS_SECONDS = 6 * 60 * 60;
return parseInt(now - SIX_HOURS_SECONDS, 10).toFixed();
}
function getLastModifyDatetime() {
var cache = CacheService.getScriptCache();
var data = parseInt(JSON.parse(cache.get(CACHE_KEY) || '-1'));
if( data < 0 ) {
const baselineTime = getBaselineTime(); // baseline time を使うように変更
putLastModifyDatetime(baselineTime);
return baselineTime;
}
return data;
}
おわりに
今は Google Calendar 側に Toggl 用のカレンダーを作ってそこにエントリ名だけを登録するようにしている。プロジェクトを細かく分けていないので(分けると続かなそうだし)こうしているけど仕事にもプライベートにも使いたいから周辺情報を入れられるようにしようかなーと迷っているところ。

