Formulaを用いた繰り返しDB生成による、当番表作成の道のり

Formulaを用いた繰り返しDB生成による、当番表作成の道のり

Tags
Personal
Web Dev
Notion
Published
December 17, 2022
Author
Motsuo
 
⚠️
この記事は、研究レポートのように、今後の期待を込めた文脈が強いです。 以下の内容を含みます。
  • FormulaによるHack的な内容の説明
  • 今後のNotionのアップデートに期待!(成果物はないです)
上記問題なければ、お付き合いください…!
 
 
 

🫠 自己紹介

はじめまして!
あなたは誰ですか?という方も多いと思うので簡単な経歴とリンクを記載させてください!
飼っているうさぎ。かわいい。
飼っているうさぎ。かわいい。
  • (名前)もつお
  • (年齢)25歳
  • (仕事)エンジニア
    • React, Next.jsを使っています!
  • (趣味)音楽、人と話すこと、寝ること
  • (好きなもの) Notion,うさぎ,ピーナッツ
 
より詳細は下記のページから確認できます!
 
 

はじめに

 
みなさん、Formulaつかっていますか。
私がNotionにハマってからプライベートでも仕事でも、色々と試行錯誤をして よりよいデータベースを!と思い、色々いじりながら作ってきました。
 
関数 - Notion (ノーション)ヘルプセンター
関数を作成する際に一番難しいのは、専門用語を理解することです。Notionで関数を使用する際に最もよく目にする用語とその意味を解説します。 上記すべてを使用した一例として、 concat("add", "text") を解説します。 関数には、チェックボックス( ブール値 )、数字、日付などの様々な引数を使用できます。 関数の 構文 では、文字列は引用符で、引数はカッコで囲む必要があります。 まず、データベースに新しいプロパティを追加して名前を付け、 プロパティの種類 メニューから 関数 を選択します。 プロパティを使用して関数に何か処理をさせるには、そのプロパティを使用する関数を入力します。 プロパティは、関数における変数のような働きをします。ご自身が付けた名前を使用します。 電卓と同じように、関数を入力することができます(いわゆる関数電卓のようなイメージです)。プロパティをカッコや引用符で囲むのを忘れないでください。 ヒント: 複雑な関数を作成する場合は、関数プロパティのポップアップではなく、Notionのページで行いましょう。 コードブロック( /code )を作成し、言語をJavascriptに設定します。こうすることで関数の構文が強調されて、エラーを発見しやすくなります。 関数プロパティを編集する際には、関数ウィンドウがポップアップ表示されます。その左のサイドバーメニューには以下のオプションがあります。 プロパティ : データベース内で使用されているすべてのプロパティを表示します。いずれかをクリックすると、適切な形式で関数に挿入されます。 定数 : πなどの一般的な定数です。クリックすると関数に追加されます。 演算子 : 実行できる簡単な計算です。左側のアイコンは、使用できるプロパティの種類を示しています。たとえば、引き算や足し算は、数値プロパティと一緒に使用できます。 関数機能 : Notionで実行できる、より複雑な定義済みの数式です。左側のアイコンは、使用できるプロパティの種類を示しています。 ウィンドウ上部のテキストボックスにこれらのいずれかを入力すると、必要なものを検索できます。 また、矢印キーで上下にスクロールすることもできます。 関数を作成する際に一番難しいのは、専門用語を理解することです。Notionで関数を使用する際に最もよく目にする用語とその意味を解説します。 上記すべてを使用した一例として、 concat("add", "text") を解説します。 関数には、チェックボックス( ブール値 )、数字、日付などの様々な引数を使用できます。 関数の 構文 では、文字列は引用符で、引数はカッコで囲む必要があります。 まず、データベースに新しいプロパティを追加して名前を付け、 プロパティの種類 メニューから 関数 を選択します。 プロパティを使用して関数に何か処理をさせるには、そのプロパティを使用する関数を入力します。 プロパティは、関数における変数のような働きをします。ご自身が付けた名前を使用します。 電卓と同じように、関数を入力することができます(いわゆる関数電卓のようなイメージです)。プロパティをカッコや引用符で囲むのを忘れないでください。 ヒント: 複雑な関数を作成する場合は、関数プロパティのポップアップではなく、Notionのページで行いましょう。 コードブロック( /code )を作成し、言語をJavascriptに設定します。こうすることで関数の構文が強調されて、エラーを発見しやすくなります。 関数プロパティを編集する際には、関数ウィンドウがポップアップ表示されます。その左のサイドバーメニューには以下のオプションがあります。 プロパティ : データベース内で使用されているすべてのプロパティを表示します。いずれかをクリックすると、適切な形式で関数に挿入されます。 定数 : πなどの一般的な定数です。クリックすると関数に追加されます。 演算子 : 実行できる簡単な計算です。左側のアイコンは、使用できるプロパティの種類を示しています。たとえば、引き算や足し算は、数値プロパティと一緒に使用できます。 関数機能 : Notionで実行できる、より複雑な定義済みの数式です。左側のアイコンは、使用できるプロパティの種類を示しています。 ウィンドウ上部のテキストボックスにこれらのいずれかを入力すると、必要なものを検索できます。 ...
関数 - Notion (ノーション)ヘルプセンター
 
Formulaの中では、時間をいじったり、過去にはプログレスバーなどを作っている人もいました。 ※プログレスバーに関しては現在Notionが対応してくれてますね。
 
一見、Excelやスプレッドシートの関数のように使えますが、NotionのFormulaはこれらとは挙動がまるで違うので、普段Excelやスプレッドシートを使っている人からすると使いづらいなと感じることもあります。
 
今回はそのFormulaを無理やりHack的な方法で当番制のDBを作成しようとしました。
結果としてうまく作れなかったのですが、とはいえこの思想を引き継いだ誰かがより良いデータベース構築をしてくれることを願って備忘録も兼ねて書き留めておこうかと思います。
 

ことのきっかけ

普段の業務の中でNotionを用いており、 当番制で何かをするということは業務の中でよくある話かと思います。 この当番制をFormulaを使って自動化できたらいいよね!というのがことの発端でした。
notion image
DBのページを日単位で作成している場合、担当ごとにチェックボックスをつけて 前日と見比べながらチェックをつける。 そういった方法で行うのが妥協案ですが、他に何かいい方法がないか模索し始めました。
 
アプローチとして考えたのは下記のようなものです。
 
notion image

自動採番を作ってみる / Auto-increment

まずは、上から順番に数字を割り当てるために、自動採番の機能を試していきます。
スプレッドシートでいう下記のような機能のことです。
指定したセルの行番号を取得したい。
指定したセルの行番号を取得したい。
 
なお、自動採番の機能については下記を参照しており、下記について解説します。
複製したDBで何をしているか実際に見ていきます。
 
まず元の海外のページのため、その訳と実際何をしているかをみていきたいと思います。
 
  1. Formulaの中にある id() 関数を用いて、一つのIDを作成し、これを親のDBへロールアップでページのID情報を渡します。そして、すべてのページのID情報を含んだIDを子へ返します。
  1. この時作成したすべてのページID情報は、順番に並んでいます。 そして自身の持つIDとすべてのページID情報を比較し、一致した以降のIDを削除します。
  1. IDのなかには”,”が含まれているため、そのコンマ数を求めて表示します。
 
下記は子のDBになります。
  • 子はすべてリレーション親DBにリレーションをして取得する。(画像赤部分)
  • 子はFormulaを使用して個別のIDを持っておく。(画像青部分)
  • 親が持つ、すべてのDBのIDを持ったものを取得する。(画像黒部分)
notion image
 
下記は親のDBになります。
  • 親はリレーションによってすべての子が紐づいている。(画像赤部分)
  • リレーションで子のすべてのIDを取得する。(画像青部分)
  • 子がすべてのIDを参照できるように、Formulaを使用して、一列にして整形しておく。(画像黒部分)
 
 
notion image
 
自動採番のFormulaの中で何をしているのか。
length(replaceAll(replaceAll(replaceAll(prop("Created IDs"), format(prop("Long ID")), "T"), "[^T]*$", ""), "[^,]", "")) + 1
 
上記を踏まえて、正規表現を使用して数値の取得を行なっています。
翻訳した内容の中でピンときた方もいるかもしれませんが、簡潔にまとめると下記のようなことです。
  1. すべてのIDが書いたものと、自分自身のIDを見比べて、自分のIDより後ろの文字列は削除する。
  1. 残りのIDにあるコンマ(,)のみに置き換える。
  1. コンマの数をカウントする。
 
ほぼ参考サイトの日本語訳と解説になりますが、次章でこれを当番制のDBにつなげていきます。
 

当番制のDBを作成するために

上記の内容をテンプレートの中に入れ込むことで、当番制が実現できるのではないかと考えました。
 
上記で解説したAuto incrementを用いて作成してみました。
Day3なのでCさんにチェックマークがついている。
Day3なのでCさんにチェックマークがついている。

問題点

  • テンプレートページも既にリファレーションとして1カウントされてしまう この為、自動的にカウントが1つ増えてしまう。 対策として、リファレーションを紐づける順序を変更し、カウントを+1する。
notion image
  • 最近追加された繰り返し機能を使用することができない。
繰り返し機能を使用した際には、リファレーションの紐付けが外れてしまいます。 都度、新しいページを作成する必要があります。
  • テンプレート機能としてDBのページ数を基点として当番者をカウントしていますが、テンプレートの状態だと、日付のページのリレーションを都度設定する必要があります
notion image
 

妥協点として

notion image
同じページに妥協した当番表も作成しました。 このページの問題点は
  • DBの総数をカウントしている為、その日固有のチェックボックスがついているわけではない。 Day2やDay3であっても、本日の担当の人に担当者にチェックマークがついてしまいます。
    • notion image
 

さいごに

結果として、求めていた当番制のDBを作成することはできませんでした。
ただ、このようなDB自体求めている方は少なくないのではないか?と考えております。
この内容を見て博識な方が改良し、僕らが求めていた「当番制のDB」を作成してくれる方がいないか?その意味を込めて今回はこの記事を作成させていただきました。
もしくはNotionのアップデートでFormulaがアップデートされることを期待しています。
 
明日は、「さみー@クリエイティブディレクター 」さんの記事です!お楽しみに!