Google Spreadsheet でゆるくタスク管理するときにオススメの設定

## はじめに

チーム開発をするとき、ガントチャートやカンバンボードなどの他にも、
メンバーが各自で気軽に書き込み・共有ができるタスク管理表みたいなものがあると便利です。

工数として見積もり取るほどではないけど、忘れないようにしておきたいものとか、
誰かに相談したいけど急ぎではないから、定例までに内容を整理して共有しておければ良いものとか、
そういった各メンバーが潜在的に抱えている宙に浮いたタスクを炙り出すのに重宝します。
![スクリーンショット 2021-11-23 午後0.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/0639b43b-78c0-c121-439b-a5cb1462518d.png)
フォーマットとしてはこんな感じです。
共同編集可能で、色々拡張がしやすいので、Google Spreadsheetを使って作成しています。

このただの表を、視覚的に分かりやすく、書き込みもあまり手間にならないようにするために、
ひと手間加えて、工夫している点がいくつかありますので、
それを共有できればと思います。
## 1. タスクに自動採番で番号をつける
MTGとかで、このタスク表を確認しながら、議論をするときは、タスクに番号がついていると便利です。
番号の採番は、手作業で行う場合、共同編集しているときに被ったりとか、それ自体が面倒だったりします。
なのでタスクの番号については、行を増やすと自動で番号が登録されるようにしておくのがオススメです。

やり方は、タスクの番号マスに下記の数式を入れるだけです。
```= ROW() - [TODOタスクヘッダ列の行番号]```
私の例だと、ヘッダが二行目にあるので、`= ROW() - 2` になりますね。
これであとはそのマスを順番に複製すれば、自動で番号がカウントアップされていきます。
![自動採番.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/7a27c75c-e007-61ea-8796-dc6fdf103ff6.gif)

## 2. データの入力規則を設定して文言を統一する
「担当」や「ステータス」といったお決まりの項目は、予め設定したリストから選択できるようにしましょう。
![入力規則.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/16c87700-e27f-c1fa-2baa-0f1e7e91bd46.gif)
こうしておくことで、手入力の手間がなくなるのは勿論のこと、
各項目の表記ゆれなどがなくなり、文言が統一されるので、
担当毎、ステータス毎にフィルタリングして、絞り込みしたりもしやすくなります。

### データの入力規則専用のシートを作成する
データの入力規則の設定方法はやり方がいくつかありますが、
入力規則のみを管理する専用のシートを作るのがオススメです。

|B1セル|D1セル|
|---|---|
|![スクリーンショット 2021-11-23 午後2.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/018e6f50-7556-dbc4-d24e-72b7ff02836d.png)|![スクリーンショット 2021-11-23 午後2.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/a97e67f8-44ad-dd6c-ce77-7b959ce83a8e.png)|

|B1セルの入力規則|D1セルの入力規則|
|---|---|
|![スクリーンショット 2021-11-23 午後2.38.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/1b18fabc-8f72-28c7-41c8-1cf754fa6579.png)|![スクリーンショット 2021-11-23 午後3.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/9f45db75-9c6b-2201-959e-585fee7e5310.png)

「入力規則」シートの「B1セル」を例として説明すると、
「B1セル」に対して、`リストを範囲で指定`で`='入力規則!$A:$A'`という条件が設定されています。
これは、この「B1セル」の、入力規則は「入力規則」シートの「A列」が参照されますよということになります。

あとはこの「B1セル」を元のタスクリストがあるシートのセルにコピペすれば、ここで定義した入力規則がコピー先にも適応されます。

#### こうすることで何が嬉しいのか
「担当」や「ステータス」といった内容はある程度普遍とはいえ、追加があることは容易に想像ができます。
こうしておくと、入力規則として参照されている列にデータを追加するだけで、
全てのセルに、この、データ追加後の入力規則が反映されるようになります。
![入力規則ケース.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/bd203a2a-ade1-1629-d503-475abfb7e0c2.gif)

## 3. 条件付き書式を設定して完了タスクは色がつくようにする
完了になったタスクは、作業のログとして履歴として残しておきたいですが、
対応中のものと混在するとノイズになってしまうと思います。
そこで、ステータスが「完了」になったものは行ごと色が変わるように設定をするとよいです。
これには、「条件付き書式」機能を利用します。

| デモ | 設定した書式設定 |
|:-:|:-:|
| ![書式設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/53485073-fd84-6698-d876-15b13519ca12.gif)|  <img width="200" align="center" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/d083ffaa-7978-e449-4d87-162cc8cef427.png"> |

`B3:G1000`の範囲で、`= $F3="完了"`と一致するものを全て緑色にするという設定です。

`$F`の`$`は絶対参照と言われ、列名または行数の前につけることで、参照する列/行を固定することができます。
`3`は今回の一覧のはじめの行です。こちらは、`$`をつけずにそのまま記入することで、行ごとに相対的に参照が行われ、3行目では`3`、4行目では`4`が都合よく参照されるようになっています。

これらの参照方法のカスタマイズにより、行毎に、「F列」に「完了」という文字がある場合は、緑色になるような書式が実現できます。

相対参照/絶対参照については、[こちら]( https://boxil.jp/beyond/a5195/ )の外部記事がおすすめです。

## 4. 編集すると最終更新日が自動で書き込まれるようにする
行が増えてくると、どれが新しく更新されたものなのか分かるようにしておきたくなってきますが、
毎回更新のたびに、手入力で日付を入力するのは手間です。
![最新更新日.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/9641861a-bc44-a11f-bbce-ca4272d3f64c.gif)
こんなかんじで、特定の行が更新されたら、最新更新日の列にその時の日付を入れるような設定
をGoogle Apps Script ( 通称:GAS )を利用して作っておきます。

### Apps Scriptを起動
拡張機能 > Apps Script からスクリプト編集画面を起動します。
<img width="300" align="center" alt="Apps Script起動" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/8c6baf32-5dcd-e01f-da8a-8ea07a48517a.png">

### 最新更新日を更新する関数とそれを実行するトリガーを登録
設定する項目は「関数」と「トリガー」の2つで、設定画面はこんな感じです。

| 関数設定 | トリガー設定 |
|:-:|:-:|
| ![スクリーンショット 2021-11-23 午後8.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/75527fef-0e12-a6ab-b28e-d6b26f441553.png)|  <img width="400" align="center" alt="トリガー設定画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93425/c96412c0-3642-4726-ac11-f72fe0ec1070.png"> |

#### 最新更新日を更新する関数
こちらが、「シート1のG列の3行目以降に最新更新日を記入する」関数になります。
`シート名`、`最新更新日時を更新するセルの列`、`最新更新日時を更新するセルの開始行`
この辺の設定は、みなさんのスプレッドーシートの設定に合わせて変更してください。

```
function insertLastUpdated() {
  // 現在触っているファイルを取得
  var activeSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  
  // 対象のシート名を指定
  var targetSheet = activeSpreadSheet.getSheetByName('シート1'); 

  // アクティブなセルの行番号を取得
  var activeRow = targetSheet.getActiveCell().getRow();

  // アクティブなセルの入力値を取得
  var activeCellValue = targetSheet.getActiveCell().getValue();

  // 更新日時を挿入するセル、G列の現在編集中の行に更新日時をセット
  var updateCell = targetSheet.getRange('G' + activeRow); 

  Logger.log(updateCell);

  // ヘッダがある2行目以降にのみ適応　
  if(activeRow > 2) { 
    if(activeCellValue) {
      updateCell.setValue(new Date());
    }
  }
}
```

#### 「最新更新日を更新する関数」のトリガー
先程登録した、関数を実行するタイミングを設定します。
今回は「編集時」にしています。
これで、スプレッドシートが編集されるたびに、先程追加した関数が実行されて、
編集中の行の「G列」にその時の日付が更新されるようになります。
※トリガーの設定にはApps Scriptが自分のアカウント内のドキュメントにアクセスするための許可設定が必要になります。

あとは元のスプレッドシートに戻って、ページ更新するとApps Scriptでの設定内容が反映されます。

## おわり
最後まで見ていただきありがとうございました。
GASまで使い出すと何でもできて楽しいですね。
次は「最後の行にタスクが登録されたら、次の行に空のタスクをオートフィリングで追加する」機能とかも入れてみたいと思ってます。

今回ご紹介したシートのサンプルをこちらにおいておきます。
閲覧限定で公開しておきますので、自分のアカウントにコピーを作成して、
こちらベースにカスタマイズしていっていただけると良いかと思います。
https://docs.google.com/spreadsheets/d/1-mQu32A6o-cOLwoP7CITAx5R0ih8HCmaG303G_-7bSI/edit?usp=sharing