はじめに
こんにちは、ニフティの佐々木です。みなさんは、Notionは好きですか?NotionではUIベースで様々なことを実現できるので便利ですよね。
個人的にも最近はドキュメントを書くだけでなく個人的なタスク管理としてもガッツリ使っているので、無くてはならない存在だなと感じます。
今回はNotionの機能の一つであるNotionDBを用いて、スクラム開発で使用するSBIとPBIのカンバンボードを作りながら、あれやこれやの欲しい機能を無理やり自動管理で実現してしまおう!という記事になります。
この記事の内容
- NotionDBを用いたカンバンボード自動化方法
準備
前提条件
スクラムのカンバンボードで使用する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

- 未着手
- 保留
- 進行中
- 完了

連携方法
NotionDBには「リレーションとロールアップ」というDB間の連携に便利な機能があるので、基本的にはこれを使っていきます。詳細はNotionのドキュメントをご参考にしてください。PBIとSBIのタスクを連携してみる
まずは、スプリントごとに着手するSBIの情報を知りたいので「SBI」と「スプリント期間」のDBをリレーションで紐づけます。

SBIのポイントをPBIで合算してみる
PBIに紐づくSBIのポイントを集計し、PBIごとの達成率を表示させます。以下のように、SBIのDBにタスクに対するポイントの見積もりを入れるプロパティを追加し数値を入れます。

PBIのDBでロールアップを追加し、SBIのDBをリレーションとして選択します。さらに、ロールアップ内で見積もりをプロパティとして指定し、計算から合計を選択すれば完了です。

PBIの完了割合を算出してみる
PBIのポイントの算出は出来ましたが、これだと全体のポイントの母数がわかるだけなので、今どのくらいSBIが進んでいるのかといった進捗具合は何も分かりません。ここでは無理やりSBIのステータスをロールアップで個別に取得し、PBIの完了割合を算出しようと思います。
まずは、SBIのDBにポイント算出用の関数プロパティを2つ追加します
- ポイント算出用(合計)
1 |
if(prop("ステータス") != "取り下げ", prop("見積もり"), 0) |
- ポイント算出用(完了)
1 |
if(prop("ステータス") == "完了", prop("見積もり"), 0) |

- ポイント(全体)
- ポイント(完了)

参考までにコードは以下のようにしてみました。関数プロパティを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)
1 |
contains(prop("現行スプリント(ロールアップ)"), "Yes") |

- スプリント(PBI)
- リレーション:SBI
- プロパティ:スプリント
- 計算:オリジナルを表示する
- 現行スプリント(PBI)
- リレーション:SBI
- プロパティ:現行スプリント(SBI)
- 計算:オリジナルを表示する


SBIとPBIのステタータス自動連携
最後にこの記事の本題でもある、「SBIとPBIのステータスを自動連携する方法」について考えてみます。ここまでの操作で、SBIのDBではステータスを管理できているので、ロールアップなどを用いてPBI側とステータスも連携させてしまえば良さそうです。
ということで、まずはステータスを取得するためのロールアップをPBIのDBに追加します。
- ステータス(ロールアップ)
- リレーション: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("ステータス(ロールアップ)"), "保留"), "🟢完了", "🟠保留"), "🟤未着手")) |

式のみだと分かりづらいので、関数式の説明を以下に書いておきます。このあたりはプロジェクトごと管理方法に合わせてカスタマイズすると良さそうです。
- 着手中
- 紐づくSBIのうち1つでも「着手中」が存在していれば反映される
- もしくは「着手中」が存在しない場合でも、紐づくSBIに一部でも「完了」が存在していれば反映される
- 完了
- 紐づくSBIが全て「完了」になっていれば反映される
- 保留
- 紐づくSBIに「未着手」「着手中」が存在せず、他全てが「完了」「保留」である場合のみに反映される
- 未着手
- 紐づくSBIが全て「未着手」、もしくは紐づくSBIが存在しない場合に反映される
成果物
色々詰め込んでしまいましたが、これで「ステータス」「スプリント」「ポイント」が自動連携されたカンバンボードの作成が完了したと思います。この状態でPBIのボードビューから「ステータス(自動連携)」でグループ化を行うと、以下のような表示になります。

まとめ
今回は、NotionDBを用いたカンバンボードの自動連携について紹介しました。これはカンバンボードの作成に限らずですが、実際にやってみた感想として、NotionDBを用いた改善では「試しに触ってみて少しづつ理解しながら改善していく」という形を取るのが良いのかなと感じました。
実際、業務で取り組む際には「こういう機能があったらいいな〜」といった疑問や、開発メンバーの意見なども取り入れながら少しづつカンバンボードに反映させていく…という手法を取っていました。結果的に、遠回りにはなりましたがNotion自体の機能や自動化の勘所など、多くの学びが得られたなと思います。
ただし、NotionDBにはリレーションを追加すると動作が重くなってしまう…という問題があるため、実際の改善でもこれ大きくぶち当たりました…。もし、自動化を試すのであれば「チームメンバーのPCのスペックとも相談しながらあまり機能を詰め込みすぎないようする」といった工夫が必要になってくるかと思います!
カンバンボードに限らず、NotionDBを使って何かを自動化をするための参考に少しでもなれば嬉しいです。
参考記事
We are hiring!
ニフティでは、さまざまなプロダクトへ挑戦するエンジニアを絶賛募集中です!ご興味のある方は以下の採用サイトよりお気軽にご連絡ください! Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!