はじめに
Notion Tips の第164回目は新規作成したり日付を設定したタスクに自動的にスプリントを設定するオートメーションを解説します。ただし、この処理はかなり複雑な裏技なため、理解をせずに間違えて設定するとデータベースが重くなる原因となるため、個人の責任で実施してください。
オートメーションにおけるリレーション設定
現在のオートメーションは、数値・文字列・セレクタなど数式で記述できるものについては設定ができるようになりました。ただし、リレーションについてはブロックを指定することでしか設定できないので、既存のページを削除することはできるものの、追加に関しては固定のページを設定することしかできませんでした。例えば直近では、タイトルの接頭子で自動的にプロジェクトを設定する : Notion Tips (151) - hkob’s blog を紹介しましたが、この時のプロジェクトは固定なものを設定しておりました。
また、今回紹介する日付設定におけるスプリント自動割り当ては、直近のカレンダータスクにスプリントを割り当てるスクリプト : Notion Tips (152) - hkob’s blog にて紹介した calendar_to_sprint.rb を使っていました。これは、本来はスプリント切り替え時に次のスプリントの日付のものを自動的に設定するスクリプトです。ただし、急に今週のカレンダータスクが作成された時には、スプリントが設定されません。そのため、タスク生成の処理の後に自動的に calendar_to_sprint.rb を実行していました。このため、Alfred でタスクを生成するたびに、iTerm の画面が出てきてしまい、アクティブな画面が奪われることとなり、メインのタスクに切り替える一手間が発生していました。
今回は、新規ページ作成や日付設定の際に Sprint のリレーションを設定することにしています。ただし、上に書いたようにページが所有していないリレーションは設定することができません。これを実現するための裏技を海外のアンバサダーに教えてもらったので、そのやり方を解説します。ただし、リレーションがかなり深くなり、間違えた設定をするとデータベース自体がかなり重くなります。正しく中身を理解した上で設定するようにしてください。
全てのスプリントを保持する map データベースの作成
まず、全てのスプリントを保持する map データベースを作成します。ただし、過去の日付のスプリントを設定する必要はないので、current である 2024-49 および next である 2024-50、future であるスプリント92 しか入れておきません。スプリントが更新され、スプリント 92 が 2024-51 に変更された時には、処理を軽くするために2024-49 は消してしまいます。

スプリント作成時に自動的に map に登録するオートメーション
スプリントが更新され、新しい future が作成された時に自動的に all に登録するオートメーション「append map」を追加しておきます。

append map は以下のようになります。新しく作成された「スプリントXX」の map を all に設定するだけです。これで all から新しいスプリントがアクセスできるようになります。

Tasks に map へのリレーションを追加
全てのタスクに map へのリレーションを設定します。まず Tasks データベースに map へのリレーションプロパティを追加します。ここで、上限を 1 ページにすると同時に Two-way relation をオフにします。map テーブルから Tasks をみる必要がないためです。これを設定してしまうと map テーブルを表示した時にかなり大変なことになります。注意してください。

Task 作成時に自動的に map に登録するオートメーション
Tasks データベースにも Sprints データベース同様に map に登録するオートメーションを設定します。内容は同じです。

日付設定時にスプリントを設定するオートメーション
ここまでが準備で、これにより今回の肝の Set sprint オートメーションが実現できます。基本的には Sprint が設定されていないタスクに対して、日付が編集された時に発動します。

ここの「自分の値」で map から Sprint を取得しています。数式自体は一行でも記述できるのですが、week_id はループ内で何度も参照されるために、念のため変数に入れています(若干高速化していると期待)。

lets( week_id, prop("トリガーページ").prop("week_id"), prop("トリガーページ").prop("map").first().prop("Sprints").filter(current.prop("week_id") == week_id) )
いつかやる → 現在作業中にするボタン
先日の Launchpad の再構築でいつかやるを現在作業中にドラッグすることでスプリントを自動設定するように変更したばかりでした。今回のスプリント自動設定により、この部分がボタン化できるようになりました。以前は、Formula link から GAS を経由して、Alfred を呼び出すというかなりアクロバティくなことをしていました。今回より Notion 標準のボタン機能だけで実現できるようになりました。今回は、「Work now」というボタンを設置しています。

Work now ボタンの中身は以下のようになります。Sprint の部分は上と同じなので省略します。Next Step と Status は処理中のフラグに合わせるための設定です。

Start date は以下のように設定しています。トリガーされた時間が仮に1時間のタスクにしています。

let(sd, prop("トリガーされた時間"), sd.dateRange(sd.dateAdd(1, "hours")) )
おわりに
今回は、リレーションへ動的にページを追加方法を解説しました。具体的には、追加したいページをまとめた map データベースを用意して、そこからリレーション先を取り出すことで実現しています。今後、プロジェクト一覧も all の中に追加して、プロジェクトも動的に設定できるようにしてみたいと思います。
昨日のネタは海外のアンバサダーさんの質問に対する対応だったのでした。実は、今回の裏技は、この質問者さんが別の人の質問に対して教えてくれたものでした。やはりもう少しちゃんと英語勉強して、いろいろとやり取りをしていると世界が広がるのだと実感した二日間でした。今後も新しいことを仕入れたら、このように紹介したいと思います。