🗓️

Googleカレンダーの予定から色毎に工数をカウントし集計するGASアプリを作ってみた

2024/03/03に公開

タイトルの通り、カレンダーの予定から色毎に工数をカウントして集計するGASアプリを、TypeScriptを用いて作ってみたので紹介する。

https://github.com/tsukuboshi/gas-count-schedule-time

このGASアプリを使用すると、Googleカレンダーに記載されている予定の色を元に、以下のような形でスプレッドシートに自動で予定一覧を書き出しされ、工数合計が算出されるようになる。

背景

今までも参加するプロジェクトで稼働を集計し報告するタスクが度々あったが、その際はGoogleカレンダーを目視しながら集計していた。

しかしながら最近関わるプロジェクトが増えてきており、個人的に目視での集計が面倒に感じてきていた。

上記の問題を解消するため、当初はGoogleカレンダーの「時間の分析情報」を用いて、色ラベル毎に種類別で工数を集計しようと考えていた。

https://support.google.com/calendar/answer/12377581?hl=ja&co=GENIE.Platform%3DDesktop

https://support.google.com/calendar/answer/10738043?hl=ja

ただしこちらの機能は、有料プランに加入しているカレンダーでないと使えず、また別ファイルへのエクスポートに対応しておらずデータを管理しづらいという理由で、最終的に断念した。

そこで自分で「GASアプリを自作して集計してしまえば良いのでは?」と考え、今回のGASアプリ作成に至る。

作成物

今回のGASアプリは、src/index.ts及びsrc/example-module.tsの2つのファイルからなる。

src/index.tsは、工数集計処理を実施するために必要な情報を渡す関数である。

実際にGASを実行する際は、実行対象としてこのファイルに記載するhandler関数を指定する。

内容としては、第一引数にGoogleカレンダーIDの配列、第二引数に予定の色毎のラベル名対応マップを指定し、main関数に渡す。

import { main } from './example-module';

// eslint-disable-next-line @typescript-eslint/no-unused-vars
function handler(): void {
  main(['example1@gmail.com','example2@gmail.com'], {
    ラベンダー: '',
    セージ: '',
    ブドウ: '実家',
    フラミンゴ: '',
    バナナ: '運動',
    ミカン: '',
    ピーコック: '勉強',
    グラファイト: '',
    ブルーベリー: 'ブログ',
    バジル: 'バスケ',
    トマト: '',
  });
}

src/example-module.tsは、工数集計処理を実施する本体である。

先ほどのsrc/index.tsから渡された引数を用いて、処理を実施する。

なお工数の集計対象は自身が作成した予定、または他の人から招待され自身が承諾した予定のみとし、それ以外の予定は集計対象外としている。

https://github.com/tsukuboshi/gas-count-schedule-time/blob/main/src/example-module.ts

デプロイ手順

デプロイ手順については、リポジトリのREADMEに記載しているため以下を参考にしてほしい。

gas-count-schedule-time/README.md at main · tsukuboshi/gas-count-schedule-time

なお環境変数で必要となるGoogleカレンダーIDは、カレンダー毎に「設定メニュー」→「設定」→「マイカレンダーの設定」→「カレンダーの統合」より確認可能である。

また今回は、GASをTypeScriptでローカル開発する際に便利なasideというツールを使用して、デプロイを実施する。

asideの詳細については、以下を参考にしてほしい。

https://dev.classmethod.jp/articles/gas-aside/

使い方

事前にGoogleカレンダーで、集計したい予定毎に色分けをしておく。

色分けをしておく事で、先ほどsrc/index.tsで指定したラベル名対応マップにより、ラベル名に変換された上でスプレッドシートに出力される。

色分け完了後、以下のいずれかでGASプロジェクトを開く

npx clasp open

GASプロジェクトの「エディター」に移動すると、以下のような内容となっている。

デフォルトでは現在の年月を集計対象とするようにしているが、もし対象の年月を指定したい場合は、「プロジェクトの設定」より、事前にスクリプトプロパティにYEAR及びMONTH変数を設定する。

「エディター」画面で、上に存在する実行対象関数をhandler関数に変更する。

その後実行をクリックし、実行ログにエラーが出ずに実行完了が表示されれば処理としては問題ない。

なお最初の実行のみ以下のようにデータアクセス権限の承認が求められるため、全て許可しておく。

稼働を確認するには、GASに紐づけれられているスプレッドシートを開く。

  • ブラウザ:GASプロジェクトホームより、GASプロジェクトに紐づいているスプレッドシートを開く
  • ターミナル:以下コマンドで開く
npx clasp open --addon

正常に処理が実施された場合、現在の年月に応じてyyyy年mm月というシートが作成され、以下のようなデータが集計されている。

もし手動実行も面倒くさいという場合は、GASプロジェクトの「トリガー」画面より、任意のタイミングでhandler関数を自動実行するよう設定すると良い。

補足

例えばプロジェクトの工数のみならず、1日の稼働工数全てを割り出したい場面もあるだろう。

その場合は、複数カレンダーを作成し、全てのGoogleカレンダーIDを配列で指定する形にすると使いやすい。

例えば片方のカレンダーはMTG用でメンバー全員に共有する形にしつつ、もう片方のカレンダーはタスク用として自分の管理専用とする事で、他の人からのMTG招待を邪魔する事なく工数をカウント可能である。

最後に

GASアプリは使い慣れた言語で開発でき、かつ自動化の第一歩として非常にオススメである。

asideを用いる事でTypeScriptでも簡単に書けるようになるので、他に自動化のアイデアを思いついた際はぜひ作成してみたい。

(追記 2024/4/2)
工数合計に対する割合、及び円グラフを作成/更新する機能を追加した。

Discussion