はじめに
こんにちは、ニフティの佐々木です。
みなさんは、Notionは好きですか?NotionではUIベースで様々なことを実現できるので便利ですよね。
個人的にも最近はドキュメントを書くだけでなく個人的なタスク管理としてもガッツリ使っているので、無くてはならない存在だなと感じます。
今回はNotionの機能の一つであるNotionDBを用いて、スクラム開発で使用するSBIとPBIのカンバンボードを作りながら、あれやこれやの欲しい機能を無理やり自動管理で実現してしまおう!という記事になります。
この記事の内容
- NotionDBを用いたカンバンボード自動化方法
※ なお、この記事はNotionとスクラム開発の基本的な知識を既に持っている読者を対象にしています。
準備
前提条件
スクラムのカンバンボードで使用するSBI・PBIの管理といっても色々あるので、ここでは以下の条件で考えてみます。
- スプリント期間(2週間など一定の期間)ごとにPBI・SBIを取る
- SBIタスクは必ずPBIに紐づけられている必要がある
- SBIにはタスクの見積もりとしてポイントを振る
- スプリント期間中はSBIのタスクの進捗状況に合わせてステータスを変更する
また、基本的なカンバンボード以外に、自動化で実現したいことを以下としてみます。
- PBI側のDBからSBIの情報をまとめて集計したい
- 完了したSBIの消化ポイント数
- 着手中のPBIの達成率
- スプリント期間が変わったり、進めているタスクが取り下げになったり、といった急な状況にも柔軟に対応したい
- SBIの情報を元にPBIのスプリント期間を自動連携
- SBIの情報を元にPBIのステータスを自動連携
PBI・SBIの作成
まずは以下のようなNotionDBを3つ用意します
- PBI管理用DB
- SBI管理用DB
- スプリント期間管理用DB
日付プロパティを追加し期間を追加します。
次に、カンバンボードとして扱うためのSBIのステータスを、以下のように4種類定義してみます。
- 未着手
- 保留
- 進行中
- 完了
連携方法
NotionDBには「リレーションとロールアップ」というDB間の連携に便利な機能があるので、基本的にはこれを使っていきます。詳細はNotionのドキュメントをご参考にしてください。
PBIとSBIのタスクを連携してみる
まずは、スプリントごとに着手するSBIの情報を知りたいので「SBI」と「スプリント期間」のDBをリレーションで紐づけます。
同様に、タスクの紐づけを行うためにSBIとPBIにもリレーションを貼っておきます。双方向でリレーションを貼っておくとPBI側のDBからも操作できるのでいい感じです。
最低限のカンバンボードとしては機能しますが、更に自動化するために以下を行いました。
SBIのポイントをPBIで合算してみる
PBIに紐づくSBIのポイントを集計し、PBIごとの達成率を表示させます。
以下のように、SBIのDBにタスクに対するポイントの見積もりを入れるプロパティを追加し数値を入れます。
ここまででSBIのポイント算出はできましたが、PBI側のポイントはまだ分かりません。そこでSBIのポイントをPBI側で集計できるようにしてみます。
PBIのDBでロールアップを追加し、SBIのDBをリレーションとして選択します。さらに、ロールアップ内で見積もりをプロパティとして指定し、計算から合計を選択すれば完了です。
PBIの完了割合を算出してみる
PBIのポイントの算出は出来ましたが、これだと全体のポイントの母数がわかるだけなので、今どのくらいSBIが進んでいるのかといった進捗具合は何も分かりません。
ここでは無理やりSBIのステータスをロールアップで個別に取得し、PBIの完了割合を算出しようと思います。
まずは、SBIのDBにポイント算出用の関数プロパティを2つ追加します
- ポイント算出用(合計)
1 |
if(prop("ステータス") != "取り下げ", prop("見積もり"), 0) |
- ポイント算出用(完了)
1 |
if(prop("ステータス") == "完了", prop("見積もり"), 0) |
PBIでは以下のように、SBIで定義した値のロールアップを追加します。
- ポイント(全体)
- ポイント(完了)
さらに、PBI側でポイントの完了割合を可視化してみます。
参考までにコードは以下のようにしてみました。関数プロパティを2つ追加しています。
- ポイント計算用
1 |
prop("ポイント(完了)") / prop("ポイント(全体)") |
- 完了割合
1 |
slice("▓▓▓▓▓▓▓▓▓▓", 0, round(prop("ポイント計算用") * 10)) + slice("░░░░░░░░░░", 0, 10 - round(prop("ポイント計算用") * 10)) + " " + format(round(prop("ポイント計算用") * 100)) + "%" + "(" + format(prop("ポイント(完了)")) + "/" + format(prop("ポイント(全体)")) + "pt)" |
PBI側でスプリントを管理する
ここまでの操作で既にSBIでは、以下のようにスプリント期間でフィルターを行いどのタスクをどのスプリント期間内で行うのか、ということが一目で分かるようになったはずです。
とはいえ、似たようなビューがたくさんある場合、スプリント期間が変わる度にフィルターをわざわざ張り替えるは面倒です。それを避けるために、まずは現在のスプリント期間を算出できるようにします。
スプリント期間のDBに、以下のような3つの関数プロパティを追加します。
- 開始日
1 |
start(prop("期間")) |
- 終了日
1 |
end(prop("期間")) |
- 現在のスプリントフラグ
1 |
if(dateBetween(prop("終了日"), now(), "hours") > -24 and dateBetween(prop("開始日"), now(), "hours") < 0, true, false) |
SBIと連携させるため、SBIのDB以下のようなプロパティを追加します。
- 現行スプリント(ロールアップ)
- リレーション:スプリント
- プロパティ:現在のスプリントフラグ
- 計算:オリジナルを表示
- 現行スプリント(SBI)
1 |
contains(prop("現行スプリント(ロールアップ)"), "Yes") |
すると以下のようになるはずです。
これで、今現在の日時を比較して現在のスプリントをフィルターできるようになりました。
ですが、SBIに紐づけたスプリント期間の情報をPBIへは何も渡していないので、PBIのみで進捗を把握したい場合などでは不便です。そこでスプリント期間もPBI、SBI間で自動連携できるように、PBIでロールアップを2つ追加します。
- スプリント(PBI)
- リレーション:SBI
- プロパティ:スプリント
- 計算:オリジナルを表示する
- 現行スプリント(PBI)
- リレーション:SBI
- プロパティ:現行スプリント(SBI)
- 計算:オリジナルを表示する
これで、PBI側のDBでもスプリント期間を指定してフィルターできるようになりました。
SBIとPBIのステタータス自動連携
最後にこの記事の本題でもある、「SBIとPBIのステータスを自動連携する方法」について考えてみます。
ここまでの操作で、SBIのDBではステータスを管理できているので、ロールアップなどを用いてPBI側とステータスも連携させてしまえば良さそうです。
ということで、まずはステータスを取得するためのロールアップをPBIのDBに追加します。
- ステータス(ロールアップ)
- リレーション:SBI
- プロパティ:ステータス
- 計算:オリジナルを表示する
これで、SBI側のステータスを全て取得することができました。
ただこの状態だと1つのPBIに複数のSBIが紐付けられている場合は上手くフィルターできないので、どれか一つのステータスに絞る必要がありそうです。
そこで、ステータスを自動算出するための関数プロパティを追加します。
PBIで管理するステータスは、一旦SBIと同じ4種類とします。
- ステータス(自動連携)
1 |
if(or(contains(prop("ステータス(ロールアップ)"), "着手中"), and(contains(prop("ステータス(ロールアップ)"), "完了"), contains(prop("ステータス(ロールアップ)"), "未着手"))), "🔵着手中", if(and(contains(prop("ステータス(ロールアップ)"), "完了"), not contains(prop("ステータス(ロールアップ)"), "未着手")), if(not contains(prop("ステータス(ロールアップ)"), "保留"), "🟢完了", "🟠保留"), "🟤未着手")) |
残念ながらNotionの関数ではswitch文などが使えないので、無理やりこのようなif文で算出しました。
式のみだと分かりづらいので、関数式の説明を以下に書いておきます。このあたりはプロジェクトごと管理方法に合わせてカスタマイズすると良さそうです。
- 着手中
- 紐づくSBIのうち1つでも「着手中」が存在していれば反映される
- もしくは「着手中」が存在しない場合でも、紐づくSBIに一部でも「完了」が存在していれば反映される
- 完了
- 紐づくSBIが全て「完了」になっていれば反映される
- 保留
- 紐づくSBIに「未着手」「着手中」が存在せず、他全てが「完了」「保留」である場合のみに反映される
- 未着手
- 紐づくSBIが全て「未着手」、もしくは紐づくSBIが存在しない場合に反映される
成果物
色々詰め込んでしまいましたが、これで「ステータス」「スプリント」「ポイント」が自動連携されたカンバンボードの作成が完了したと思います。
この状態でPBIのボードビューから「ステータス(自動連携)」でグループ化を行うと、以下のような表示になります。
まとめ
今回は、NotionDBを用いたカンバンボードの自動連携について紹介しました。
これはカンバンボードの作成に限らずですが、実際にやってみた感想として、NotionDBを用いた改善では「試しに触ってみて少しづつ理解しながら改善していく」という形を取るのが良いのかなと感じました。
実際、業務で取り組む際には「こういう機能があったらいいな〜」といった疑問や、開発メンバーの意見なども取り入れながら少しづつカンバンボードに反映させていく…という手法を取っていました。結果的に、遠回りにはなりましたがNotion自体の機能や自動化の勘所など、多くの学びが得られたなと思います。
ただし、NotionDBにはリレーションを追加すると動作が重くなってしまう…という問題があるため、実際の改善でもこれ大きくぶち当たりました…。もし、自動化を試すのであれば「チームメンバーのPCのスペックとも相談しながらあまり機能を詰め込みすぎないようする」といった工夫が必要になってくるかと思います!
カンバンボードに限らず、NotionDBを使って何かを自動化をするための参考に少しでもなれば嬉しいです。