🖍️

notionの数式2.0を利用しタスク管理に新たな可能性を

2024/12/23に公開

はじめに

私たちのチームでは、チームメンバー全員が対応すべきタスクをデータベースで管理しています。ただ、タスク管理の「期限切れ」ステータスは、チーム運営メンバーが毎週金曜日のMTGに確認して手動的に「期限切れ」のステータスへ変更しています。

そこで思いつく課題:

  • 月曜期限のタスクのステータス変更は5日後になる
  • 人的ミスが発生する可能性がある(変更漏れなど)
  • そのMTGがスキップになった際にステータス変更の頻度がさらに下がってしまう

そのため、自動的にステータスが変更できるような仕組みを作れば良くないかと思いました。

対象読者

  • notionを普段から使用している方
  • notionの数式2.0をより活用したい方
  • 業務の効率化に課題を感じている方

この記事を読むことによる価値

  • notionの数式2.0を活用したタスク管理の自動化手法を学べる
  • 数式プロパティの基本的な使い方から応用まで理解できる
  • 業務プロセスの自動化によって作業効率を向上させる方法を習得できる

まずは実現したいことを考える

とりあえず、期限切れになったら自動的に「期限切れ」と表示されると良いです。

データベースの数式プロパティを作成して、下記のように数式を設定しました。

if(dateBetween(prop("期日"),now(),"days") < 0, "期限切れ", prop("ステータス"))

prop("期日")prop("ステータス")はデータベースの「期日」と「ステータス」のプロパティを参照しています。「期日」は日付のプロパティを利用しており、「ステータス」はステータスのプロパティを使用しています。

dateBetween() 関数を利用して、前後2つの日付の間の差分を出しています。使用方法として、dateBetween("日付1","日付2","日付の計算方法") のように、必要な要素を記載すれば良いです。例えば、今回の場合、「現在の時刻」から「期日」までの「日数」によって、ステータスを自動的に表示されたいので、「日付1」に「期日」、「日付2」に「今の時刻」、「日付の計算方法」に「日数」を計算するように設定すれば、今日から期日までの日数が算出されます。下記画像のレコード2の場合、2024年12月3日から2025年1月8日までの日数は「35」日と算出されました。

さらに、今回はnow()関数を使用するようにしましたが、today()関数を使用しても同じように実現できます。上記画像の「今日」プロパティはnow() 関数を利用した際の表示になっています。today()関数を使用すると、下記のように日付のみが表示されます。

これで、期日までの日数を算出できました。

この日数が0より小さくなると自動的に期限切れとなるよう続けていきます。

まず、算出した日数が0より小さな場合、「期限切れ」と表示させて、それ以外の場合にはステータスをそのまま表示させるようにif関数を使用します。notion数式のif関数の使用方法はif(”判定式”,”判定がTRUEの場合の出力値”,”判定がFALSEの場合の出力値”) となります。ここの判定式は「算出した日数が0より小さいかどうか」です。「判定がTRUE」というのは「算出した日数が0より小さい」なので、その場合には「期限切れ」と出力してほしいです。「期限切れ」は文字列として出力されるため、”期限切れ” のように””で文字を囲んで記載します。「判定がFALSE」は「算出した日数が0日以上」とのことなので、ここはステータスの値をそのまま出力するようにします。

この段階で出た結果は下記となり、実現したいことは完成しました。

ただ、現状だと違和感があり、それらについて修正していく必要があります。

次は全体を整える

違和感1 完了になっているのに「期限切れ」になってしまう

これを解決するには簡単だと思います。「完了」したものは問答無用で「完了」なので、ここで分岐させれば良いです。

ここはまたif関数の登場です。分岐を追加して、下記のように数式を設定しました。

if(prop("ステータス") == "完了",
	"完了",
	if(dateBetween(prop("期日"),now(),"days") < 0,
		"期限切れ",
		prop("ステータス")
		)
	)

これで、先ほど「期限切れ」になってしまった「完了」のタスク(レコード4)のステータスが正しく「完了」と表示されるようになりました。

違和感2 ステータスが文字のみになり視認性が下がった

この違和感を無くすには、notionの数式2.0で提供されたstyle関数を利用する必要があります。style関数の使用により、数式で出力された文字に色や背景などの設定ができるようになります。

現在style関数で使用できる有効な書式は下記となります:

  • 書式スタイル
    • "b"(太字)
    • "u"(下線)
    • "i"(斜体)
    • "c"(コード)
    • "s"(取り消し線)
  • 文字・背景の色
    • "gray"
    • "brown"
    • "orange"
    • "yellow"
    • "green"
    • "blue"
    • "purple"
    • "pink"
    • "red”

背景色の設定は色の末尾に”_background”を追加すれば良いです。例えば、赤い背景色を設定したい場合、”red_background”と記載すれば反映されます。

style関数の使用方法は、style(”設定対象”,”スタイル書式1”,”スタイル書式2”) のように記載すると設定できます。例えば、「完了」の2文字に青色と緑背景を設定したい場合、style(”完了”,”blue”,”green_background”)と記載すると良いです。

style関数を理解したうえで、今回設定したい文字と背景の色を決めて、数式に書き込みます。

想定としては、期限切れに赤、完了に緑、進行中に青と設定したく、下記のように数式を編集しました。

if(prop("ステータス") == "完了",
	 style("完了","green","green_background"),
	if(dateBetween(prop("期日"),now(),"days") < 0,
		 style("期限切れ","red","red_background"),
		 style(prop("ステータス"),"blue","blue_background")
		)
	)

設定した結果は下記のようになります。

スタイルを追加したことで視認性は向上しましたが、「期日が来ていない場合はステータスの値をそのまま表示する」という当初の設定が、かえって違和感を生じさせる結果となりました。

違和感3 「開始前」と「進行中」が同じ色で表示されてしまう

これを解決には、またif関数で分岐を追加すると良いです。

ただ、分岐を追加する場合をちゃんと考えないといけないです。一番大きな分岐は変わらず「完了」になっているかどうかとなります。その次にくる分岐点は「期限切れ」と考えています。理由として、「完了」以外のステータスにおいて、期限を過ぎたものは全て期限切れと認識しております。これで、今回の分岐を入れる場所が明確になりました。「期限切れ」判定の結果が「FALSE」になっているところに入れると良いです。

if(prop("ステータス") == "完了",
	style("完了","green","green_background"),
	if(dateBetween(prop("期日"),now(),"days") < 0,
		style("期限切れ","red","red_background"),
		if(prop("ステータス")=="進行中",
			style(prop("ステータス"),"blue","blue_background"),
			style(prop("ステータス"),"yellow","yellow_background")
			)
		)
	)

ここでは「開始前」の場合、黄色表示されています。結果として、下記のように「進行中」と「開始前」も色で見分けられるようになりました。

最後に遊び心を忘れずに

今回使用している7つのレコードのうち、レコード2とレコード5はどちらも「進行中」になっていて、この2つのレコードを作った理由は何と思われる方もいらっしゃるかもしれません。

実は、最後の遊び心のために、この2つのレコードを作りました。レコード2とレコード5の差分は期日が異なります。レコード2には期日まで1ヶ月以上の余裕があります。この心の余裕をステータスにも表現することができます。

if(prop("ステータス") == "完了",
	style("完了","green","green_background"),
	if(dateBetween(prop("期日"),now(),"days") < 0,
		style("期限切れ","red","red_background"),
		if(prop("ステータス")=="進行中",
			if(and(dateBetween(prop("期日"),now(),"days") >= 0, (dateBetween(prop("期日"),now(),"days") < 31)),
				style(prop("ステータス"),"blue","blue_background"),
				style("余裕あり!","purple","purple_background")
				),
			style(prop("ステータス"),"yellow","yellow_background")
			)
		)
	)

ここで期間指定のため新たにand関数を使用することにしています。

and関数を使用して、2つの条件を同時に満たすかどうか判断できます。使用方法として、and(”条件1”, “条件2”)となり、さらにif関数と組み合わせて、and関数の結果に応じて出力ができます。今回は「進行中」ステータスの中、期日までの日数が「0日以上」かつ「30日以下」の2つの条件を満たせかどうかを判断するようにしています。この2つの条件に満たしている場合、そのままステータスの値の出力します。今回の数式の構成上、この2つの条件を同時に満たさない場合、期日までに31日以上あることになるので「余裕あり!」と出力するようにしています。

さらに、より視認性を向上するため、文字列にアイコンなどを追加して出力することもできます。最終的に下記のようにステータスが表示され、期日によって自動的に「期限切れ」になるように実現できました!

おわりに

この記事を通して、notionの数式2.0について以下のポイントを解説しました:

  • 期日に基づく自動的なステータス更新の実装
  • if関数とand関数を使用した条件分岐による期限管理
  • style関数を活用してステータスの視認性を向上

これらの機能を活用することで、より効率的なタスク管理が可能となり、チームの生産性向上に貢献できます。

Bitkey Developers

Discussion