Google Spreadsheet で高機能ガントチャート！

# はじめに

最近、いろいろなプロジェクトを担うことになり、タスク管理や情報共有、状況報告など、手間のかかる仕事が増えてきました。こういう場合、WBSやガントチャートは便利なのですが、複数のメンバーと一緒に利用するとなるとそれなりに学習コストについても考える必要があります。
いろいろなツールを使ってみて感じたことは、やっぱり一番使い慣れているGoogle Spreadsheet（以後GSS）でガントチャートが実現できると非常に効果が高いことが分かりました。
そこで、GAS（Google Apps Script）を使ってGSS版のガントチャートを作ってみたので、ここで紹介したいと思います。
![2022-05-08_11h08_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/14799aff-5aee-e0d8-6263-cb465323fb77.png)

# 機能一覧
- 日本の祝日を動的に取得し利用できます。
- ユーザー個別の休日を定義し利用できます。
- ４階層までのタスク管理ができます。
- 各タスク毎に開始日、終了日、進捗率、メモを入力することができます。
- ステータスやガントチャートは自動的に処理されます。
- 本日時点の進捗状況をイナズマ線で確認できます。
- 日ベースのガントチャートを確認したい場合は、Day chartが便利です。
- 週ベースのガントチャートを確認したい場合は、Week chartが便利です。

# すぐに試してみたい方へ

下記のスプレッドシートをコピーすることで利用できます。
<font color="red">※下記リンクからスプレッドシートを開く　→　メニュー　→　ファイル　→　コピーを作成</font>

[<font color="blue">**<INS>ガントチャート（テンプレート）</INS>**</font>](https://docs.google.com/spreadsheets/d/1pUAK7yAxJyOQrWcN_tu2y87XEEiUS-REELRY8eBBHm0/edit?usp=sharing)

<font color="red">※注意点
列の追加や、ヘッダー行への行追加はしないでください。
どうしてもしたい場合は、GASのコードも合わせて修正する必要があります。
</font>
スクリプトもコピーされるので自由に改変して使ってあげてください。

## 利用開始までの流れ

### ０．スクリプト実行の承認
利用するための手順をすすめる中で、スクリプトを実行する際に、初回のみ承認を求める画面が表示されます。
承認するための作業が非常にわかりにくいので、[こちらのサイト](https://paya02.com/it/google-apps/approval) を参考にしてみてください。
<font color="red">
※初回スクリプト実行時は、承認が必要なためスクリプトは実行されません。承認した後に再度実行してください。
</font>
### １．祝日アップデート
「メニュー -> ガントチャート -> 祝日アップデート」 を実行し、去年・今年・来年の祝日データを取得します。
![2022-05-08_10h12_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/d4ffc2b8-01d7-d6a2-ab5d-4e3c8e200ff4.png)
取得した祝日データは「Holiday」シートで確認することができます。
祝日データは[Holidays JP API](https://holidays-jp.github.io/) を利用して取得しています。

### ２．ユーザー定義の祝日
「Holiday」シートに日本の祝日とは別に、個別の祝日をセットすることができます。
![2022-05-08_11h31_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/97ce521c-6809-495f-759e-d3d9ea605049.png)

### ３．プロジェクトの開始日、終了日
「Schedule」シートの N1:O1 にプロジェクトの開始日と終了日を入力します。（この期間のガントチャートを生成します）
![2022-05-08_10h36_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/00768757-d78f-b819-0bd7-aa7abede6aeb.png)

### ４．ガントチャート生成
「メニュー -> ガントチャート -> PJT期間生成」 を実行し、プロジェクト期間分のガントチャートを生成します。
![2022-05-08_10h38_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/c14d3fd5-70a7-361d-73ab-3661c2637aad.png)

### ５．タスクの追加
任意の場所に行を挿入し、階層に合わせてタスクを追加します。
![2022-05-08_10h56_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/22344ab9-ae15-1f39-3aa5-4a6cef214f72.png)
タスクの開始日と終了日と進捗率を入力することで自動的にガントチャートとステータスに反映されます。

# 機能説明
### 日本の祝日を動的に取得
[Holidays JP API](https://holidays-jp.github.io/) を利用して、去年、今年、来年の３年分の日本の祝日情報を取得します。
取得した祝日情報は「Holiday」シートで確認することができます。
ガントチャートはこの休日情報が描画されますので、「Holiday」シートを編集することで休日情報を変更することができます。
![2022-05-23_20h04_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/fea6f78b-78fb-5d3d-4500-b90cad6e1755.png)

### ユーザー個別の休日を定義
日本の祝日以外の休日を設定したい場合は、別列に定義することができます。
別列に定義することで、APIによる上書きを回避できます。
![2022-05-08_11h31_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/f4a2fc2e-f786-ba5d-c4e4-aab5b3f316e6.png)

### ４階層までのタスク管理
各階層の意味合いは下記の通りですが、プロジェクトに合わせて、ヘッダー名称を変更して利用してください。
- １階層：Milestone
- ２階層：Task（Parent）
- ３階層：Task（Child）
- ４階層：Task（Child Sub）

任意の行を挿入して、各階層に名称を記載することで、自動的にIDが採番されます。
![2022-05-23_19h54_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/9e25b029-9eba-cd0c-098b-2d40f5b625af.png)

### タスクの開始日、終了日と進捗率の描画
開始日と終了日は、プロジェクト全体の開始日、終了日の範囲内になるように入力制限がされます。
開始日と終了日を入力すると、自動的に期間分のガントチャートが青色背景で表現されます。
進捗率を入力すると割合に応じた実績状況がガントチャート上に黄色背景で表現されます。
また、進捗率と期間より、ステータスが自動的に決定されます。
![2022-05-23_20h58_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/f4237698-2920-d7d3-1679-7d1178b3d74b.png)

### 親タスクの自動更新
親タスクは子タスクのサマリとなるように、開始日、終了日と進捗率が自動更新されます。
子タスクの最小の開始日と、最大の終了日が、親タスクの開始日と終了日になります。
子タスクの進捗率の平均が、親タスクの進捗率になります。
また、親タスクの進捗率が更新されることでステータスも自動的に更新されます。
![2022-05-23_20h58_441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/f1290eff-27b1-40e7-db1a-8a5274f9815e.png)
※親タスクの更新は、連鎖的にすべてのタスクが更新されるため、最終編集時の１分後に一括で自動更新処理が実施されます。

### 本日の状況をイナズマ線で確認
ガントチャートでは、本日の日付が黄色背景になり、現状把握が可能です。
※本日日付は、毎日０時～１時に自動更新されます。
タスクの進捗率より、予定期間（開始日、終了日より）に対しどの程度完了しているのがイナズマ線が黄色背景で描画されます。
![2022-05-23_21h27_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/4a646cb3-6b14-592e-8fcb-9b48890b2aee.png)

### Day chart
「Day chart」シートを開くことで、ガントチャートをメインで閲覧できます。
日ベースの進捗状況を確認したい場合は、便利です。
![2022-05-23_21h35_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/e3fce3f9-fb42-6f84-54bc-60584599bb91.png)

### Week chart
プロジェクト期間が長期の場合は、日ベースだと全体状況が把握しづらいときがあります。
「Week chart」シートを開くことで、週単位でまとまったガントチャートを閲覧できます。
![2022-05-23_21h38_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615083/e2982a5b-44f0-5664-3c49-67faa506853b.png)
 
# おわりに

GSSを使ったガントチャートは検索すると色々でてくるので、それなりにニーズがあるものだと思います。しかし、自分がほしいと思った機能が網羅されてるものがなかったので作ることにしました。おかげでGASを楽しく学ぶことができました。
GASのコードもなるべく処理が早く完了するように、APIの呼び出し回数が最少になるように工夫しています。
さらに、タスク全体を更新する処理については、編集の度に都度実行すると重くなるため、トリガーを利用し、最終編集時の１分後に実行するなどの工夫をいれています。もしGASに興味ある方は、ソースコードも見てもらえると面白いと思います。