記事一覧に戻る

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

2025年2月18日

🎅🏻
これは「Notion Community Advent Calendar 2022」の17日目の記事です。

⚠️
この記事は、研究レポートのように、今後の期待を込めた文脈が強いです。 以下の内容を含みます。

🚧
目次

🫠 自己紹介

はじめまして!

あなたは誰ですか?という方も多いと思うので簡単な経歴とリンクを記載させてください!

より詳細は下記のページから確認できます!

https://motsuo.vercel.app/about-me

はじめに

みなさん、Formulaつかっていますか。

私がNotionにハマってからプライベートでも仕事でも、色々と試行錯誤をして よりよいデータベースを!と思い、色々いじりながら作ってきました。

https://www.notion.so/ja-jp/help/formulas

Formulaの中では、時間をいじったり、過去にはプログレスバーなどを作っている人もいました。 ※プログレスバーに関しては現在Notionが対応してくれてますね。

一見、Excelやスプレッドシートの関数のように使えますが、NotionのFormulaはこれらとは挙動がまるで違うので、普段Excelやスプレッドシートを使っている人からすると使いづらいなと感じることもあります。

今回はそのFormulaを無理やりHack的な方法で当番制のDBを作成しようとしました。

結果としてうまく作れなかったのですが、とはいえこの思想を引き継いだ誰かがより良いデータベース構築をしてくれることを願って備忘録も兼ねて書き留めておこうかと思います。

ことのきっかけ

普段の業務の中でNotionを用いており、 当番制で何かをするということは業務の中でよくある話かと思います。 この当番制をFormulaを使って自動化できたらいいよね!というのがことの発端でした。

Image

DBのページを日単位で作成している場合、担当ごとにチェックボックスをつけて 前日と見比べながらチェックをつける。 そういった方法で行うのが妥協案ですが、他に何かいい方法がないか模索し始めました。

アプローチとして考えたのは下記のようなものです。

Image

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

まずは、上から順番に数字を割り当てるために、自動採番の機能を試していきます。

スプレッドシートでいう下記のような機能のことです。

指定したセルの行番号を取得したい。
指定したセルの行番号を取得したい。

なお、自動採番の機能については下記を参照しており、下記について解説します。

複製したDBで何をしているか実際に見ていきます。

https://notionthings.com/2022/03/06/auto-increment-table-row-ids/

まず元の海外のページのため、その訳と実際何をしているかをみていきたいと思います。

  • Formulaの中にある id() 関数を用いて、一つのIDを作成し、これを親のDBへロールアップでページのID情報を渡します。そして、すべてのページのID情報を含んだIDを子へ返します。
  • この時作成したすべてのページID情報は、順番に並んでいます。 そして自身の持つIDとすべてのページID情報を比較し、一致した以降のIDを削除します。
  • IDのなかには”,”が含まれているため、そのコンマ数を求めて表示します。
  • 下記は子のDBになります。

  • 子はすべてリレーション親DBにリレーションをして取得する。(画像赤部分)
  • 子はFormulaを使用して個別のIDを持っておく。(画像青部分)
  • 親が持つ、すべてのDBのIDを持ったものを取得する。(画像黒部分)
  • Image

    下記は親のDBになります。

  • 親はリレーションによってすべての子が紐づいている。(画像赤部分)
  • リレーションで子のすべてのIDを取得する。(画像青部分)
  • 子がすべてのIDを参照できるように、Formulaを使用して、一列にして整形しておく。(画像黒部分)
  • Image

    自動採番のFormulaの中で何をしているのか。

    参考:https://notionthings.com/2022/03/06/auto-increment-table-row-ids/

    length(replaceAll(replaceAll(replaceAll(prop("Created IDs"), format(prop("Long ID")), "T"), "[^T]*$", ""), "[^,]", "")) + 1plain text

    上記を踏まえて、正規表現を使用して数値の取得を行なっています。

    翻訳した内容の中でピンときた方もいるかもしれませんが、簡潔にまとめると下記のようなことです。

  • すべてのIDが書いたものと、自分自身のIDを見比べて、自分のIDより後ろの文字列は削除する。
  • 残りのIDにあるコンマ(,)のみに置き換える。
  • コンマの数をカウントする。
  • ほぼ参考サイトの日本語訳と解説になりますが、次章でこれを当番制のDBにつなげていきます。

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

    上記の内容をテンプレートの中に入れ込むことで、当番制が実現できるのではないかと考えました。

    上記で解説したAuto incrementを用いて作成してみました。

    Day3なのでCさんにチェックマークがついている。
    Day3なのでCさんにチェックマークがついている。

    問題点

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

  • テンプレート機能としてDBのページ数を基点として当番者をカウントしていますが、テンプレートの状態だと、日付のページのリレーションを都度設定する必要があります
  • Image

    妥協点として

    Image

    同じページに妥協した当番表も作成しました。 このページの問題点は

  • DBの総数をカウントしている為、その日固有のチェックボックスがついているわけではない。 Day2やDay3であっても、本日の担当の人に担当者にチェックマークがついてしまいます。
  • さいごに

    結果として、求めていた当番制のDBを作成することはできませんでした。

    ただ、このようなDB自体求めている方は少なくないのではないか?と考えております。

    この内容を見て博識な方が改良し、僕らが求めていた「当番制のDB」を作成してくれる方がいないか?その意味を込めて今回はこの記事を作成させていただきました。

    もしくはNotionのアップデートでFormulaがアップデートされることを期待しています。

    明日は、「さみー@クリエイティブディレクター 」さんの記事です!お楽しみに!