【テクニカル・上級編】Notionの「数式プロパティ2.0」を活用した日付・時間の複雑な差分計算:稼働日ベースのタスク遅延アラートシステムの構築 – プロジェクト・ナレッジ管理活用バイブル

Notion数式2.0の限界を突破せよ:稼働日ベースのタスク遅延自動検知システム

開発チームのベロシティを蝕む最大の癌、それは「情報のサイロ化」と「形骸化したタスク管理」だ。
「期限が過ぎているのに誰も気づかない」「土日を挟んでいるからまだ猶予があると勘違いしていた」。こんなプリミティブな理由でスプリントの予測可能性(Predictability)が狂う現場を、私は数え切れないほど目撃してきた。

多くのチームがNotionを導入するものの、デフォルトの「日付プロパティの差分」だけで満足し、カレンダー上の単純な引き算で遅延を判定している。結果どうなるか? 金曜日にアサインされた「3営業日以内」のタスクが、土日を跨いだことで月曜日に強制赤字(遅延アラート)となり、エンジニアのモチベーションを無慈悲に削り取る。

本稿では、Notion 数式プロパティ2.0(Formula 2.0) のポテンシャルを極限まで引き出し、土日やカスタム祝日を完全除外した「真の稼働日(Business Days)ベースの遅延アラートシステム」の構築手法を、一切の妥協なく解説する。

生粋のエンジニアリング組織を作るための、高度な関数ハックとアーキテクチャ設計の全貌をここに明かす。

—

1. アーキテクチャ概要:なぜ標準機能では不十分なのか

Notionの標準機能である `dateBetween(end, start, “days”)` は、文字通り「カレンダー上の経過日数」を返すだけだ。これでは、金曜から月曜への移行を「3日経過」と誤認する。真に必要なのは、タイムゾーンを考慮しつつ、非稼働日(Weekend / Holiday)の配列を動的にスキップするアルゴリズムだ。

今回構築するシステムのアーキテクチャは以下の通り。

1. データベース設計: タスクDBに加え、全社共通の「祝日マスタDB」をリレーション結合。
2. 数式エンジン(Formula 2.0): 配列操作関数(`map`, `filter`, `includes`)を駆使し、開始日から期限日までの間に存在する非稼働日を動的にカウントから除外。
3. 動的ステータス評価: 残り稼働日数と現在のステータスをマトリクス評価し、リスクレベルに応じたアイコンを自動アサイン。

—

2. 実装ステップ:稼働日差分計算エンジンの構築

まずは、開始日(`Start Date`)から期限日(`Due Date`)までの「純粋な稼働日数」を算出する数式を組み立てる。

前提となるプロパティ構造

  • `Start Date`: 日付(Date)
  • `Due Date`: 日付(Date)
  • `Status`: ステータス(Status)
  • `Holidays`: リレーション(Relation) – 祝日マスタDBへのリンク(各レコードに日付プロパティが存在するものとする)

稼働日計算のコア・フォーミュラ(Formula 2.0)

以下のコードを「稼働日差分」を算出する数式プロパティに流し込む。Formula 2.0の真骨頂であるローカル変数定義(`let`)と配列操作をフル活用している。

/ 1. データの存在チェックと初期化 /
let(
/ 担当範囲の日付が存在しない場合は0を返す /
s, prop(“Start Date”),
d, prop(“Due Date”),
if(s == “” or d == “”, 0,

/ 2. 開始日から終了日までの全カレンダー日付の配列を生成 /
let(
rawDays, dateBetween(d, s, “days”),
if(rawDays < 0, 0, / 3. 祝日マスタから日付のリスト(文字列配列)を取得 / holidayList, prop("Holidays").map(current.prop("Date")), / 4. 0から総日数までループし、土日と祝日を除外してカウント / / 冗長なループを避け、Array.mapとfilterのコンビネーションで高速化 / sequence(0, rawDays).filter( let( currentDate, s.dateAdd(current, "days"), dayOfWeek, currentDate.day(), dateStr, currentDate.format("YYYY-MM-DD"), / 土日(0=日曜, 6=土曜)でも祝日リストにも含まれない日=「稼働日」 / dayOfWeek != 0 and dayOfWeek != 6 and not(holidayList.includes(dateStr)) ) ).length() ) ) ) ) > Expert Tip (パフォーマンス最適化):
> Notionの数式エンジンはクライアントサイド(または軽量なサーバーレスワーカー)で評価される。巨大な日付レンジ(数年単位)を `sequence` で生成するとメモリ消費が跳ね上がり、UIのレンダリングがブロックされる。タスク管理においては、最大でも過去〜未来の1年程度(365要素)にレンジを制限するガード句を入れるのがプロダクション品質の鉄則だ。

—

3. 危険度自動判定と動的アイコンマッピング

稼働日ベースの残り日数(あるいは超過日数)が算出できたら、次はそれを元にチームの注意を引く「動的アラート」を実装する。

ここで目指すのは、単なる数値の羅列ではなく、人間の認知負荷を最小化する視覚的フィードバックの完全自動化だ。

評価マトリクス

  • 完了済み(Done): 🟢 完了
  • 残り稼働日 > 2日: 🔵 順調 (On Track)
  • 残り稼働日 0〜2日: 🟡 警戒 (At Risk)
  • 期限超過(稼働日ベースで超過): 🔴 炎上 (Overdue)

危険度判定のフォーミュラ

上記の稼働日計算結果(ここでは仮に別の数式プロパティを `NetDays` と呼ぶ、あるいは同一数式内に内包する)をベースに、ステータスに応じた出力を生成する。

let(
/ ステータスが完了している場合は即座に緑を返す /
status, prop(“Status”),
if(status == “Done”, “🟢 完了”,

let(
/ 期限日までの残り稼働日(今日からDue Dateまでの稼働日)を算出するロジックをここに適用 /
/ ここでは簡略化のため、プロパティ “RemainingBusinessDays” を参照する前提とする /
remDays, prop(“RemainingBusinessDays”),
isPastDue, prop(“Due Date”) < now() and remDays <= 0, if(isPastDue, / 炎上:超過した「稼働日数」を動的表示 / "🔴 炎上 (+" + abs(remDays) + "営業日超過)", if(remDays <= 1, "🟡 警戒 (残り" + remDays + "営業日)", "🔵 順調 (残り" + remDays + "営業日)" ) ) ) ) ) ---

4. チームのベロシティを爆発させる運用の極意

数式を組んで満足してはならない。エンジニアリングマネージャー(EM)やテックリードがこの仕組みをどう組織に定着させるか、その運用レイヤーの知見を共有する。

1. 「Slack / Webhook連携」によるプロアクティブ通知

Notion単体では「期限が近づいたら通知する」ことはできても、「稼働日ベースでの動的アラート」をプッシュ通知するネイティブ機能には限界がある(標準のインボックス通知はカレンダーベースの単純なものが多い)。
ここで、Notion APIと自製の軽量スクリプト(Node.js / Python)を組み合わせる。

// 簡易Node.jsスニペット: Notion DBをポーリングし、カスタムアラートをSlackへ流すCronジョブ
import { Client } from “@notionhq/client”;

const notion = new Client({ auth: process.env.NOTION_TOKEN });
const DATABASE_ID = process.env.NOTION_DB_ID;

async function checkTaskVelocityRisks() {
const response = await notion.databases.query({
database_id: DATABASE_ID,
filter: {
property: “DynamicAlert”,
formula: {
string: {
contains: “🔴 炎上”
}
}
}
});

for (const page of response.results) {
// 炎上タスクを検知してSlackの緊急チャンネルへWebhook送信
// 担当者へのメンションを自動解決してアサイン漏れを防ぐ
dispatchSlackAlert(page);
}
}

このスクリプトをKubernetesのCronJobやGitHub Actionsで毎日朝9時に実行することで、人間の認知に頼らない「完全自動のデッドライン・ガーディアン」が完成する。

2. ボトルネックの可視化(ビューの設計)

Notionのボードビューやタイムラインビューにおいて、この「動的アラート」プロパティをカードのプレビューに必ず表示させよ。
朝会(Standup)の際、チームメンバーはカレンダーの締め切りではなく、「稼働日ベースの残り日数」を直視させられることになる。これにより、「週末があるから大丈夫」という甘えや、金曜夜に無理なデプロイを強行するアンチパターンが自然消滅する。

—

終わりに:ツールを従え、コードを愛せよ

Notionは単なる「お洒落なメモ帳」ではない。Formula 2.0の登場により、リレーショナルな要件定義、複雑なビジネスロジックの埋め込み、そしてAPIを介した外部パイプラインとの統合が可能な、「極めてモダンなローコード・データベースエンジン」へと昇華した。

ここで紹介した稼働日計算と動的アラートのシステムは、あなたのチームの無駄なコミュニケーションコストを削ぎ落とし、純粋な開発(Coding)に集中するための強力なシールドとなる。

知見を実装に落とし込み、チームのベロシティを物理の限界まで加速させろ。コードを書くように、Notionをハックしろ。

タイトルとURLをコピーしました