前の記事
Notionのデータベースでランダムに1件だけ表示する方法
今回は、Notion のデータベースでランダムに 1件だけ表示する方法を解説します。
私は Notion のデータベースに日記を書いたり、英単語を覚えるのに活用したりしています。最近、「日記をランダムに 1件だけ表示して振り返りをしたい」「英単語をランダムに 1件表示して単語カードっぽい使い方をしたい」ということを考えていました。しかし、Notion のデータベースの通常の機能では、ランダムにページを並び替える機能はありませんし、フィルタ機能も最小 10件表示であり、1件のみを表示することはできません。
そこで色々試した結果、以下のプロパティを組み合わせて工夫すれば「ランダムに 1件だけ表示する」ということ実現することができました。
- 「関数」プロパティ
- 「リレーション・ロールアップ」プロパティ
今回は、上記を活用して「データベースでランダムに 1件だけ表示する」方法を解説します。かなりマニアックな内容となりますがデータベースや関数の使い方の参考になると思うので、ぜひ最後まで見てみてください。
完成したデータベース
今回は日記データベース(3件)からランダムに 1件だけフィルタして表示する例を解説します。
以下はフィルタをかけて、1件のみランダムに表示した様子です。
時間が経ってページを更新すれば(またはデータベースを更新すれば)、表示されるページが変わります。時間は自由に調整可能です。
ランダムに 1件表示するための手順
手順の概要としては以下となります。
- メインの日記データベースでランダムな数字(ID)を生成する関数プロパティを作成する
- メインとは別のデータベースを作成し、 1. の手順で作成したランダム ID をメインのデータベースから取得・集計し、ランダム ID の最大値を取得する。
- 2. で集計したランダム ID の最大値をメインのデータベースで取得し、「各ページのランダム ID」と「ランダム ID の最大値」が一致したページのみフィルタして表示する。
まずはデータベースを 2つ準備します。この 2つのデータベースをリレーションし、ロールアップを活用することで 1件のみフィルタをかけることができます。
- 日記を記録するデータベース「サンプル_DB_日記」
- 1 件のみフィルタするためのデータベース「サンプル_DB_ID抽出用」
「サンプル_DB_ID抽出用」データベースは 1ページのみ作成し、名前を「ID抽出用」としておきます。
続いて、「サンプル_DB_日記」でランダムな数字を生成する関数プロパティを準備します。以下は 1分に 1度ランダムな数字を生成する関数です。 60000
という数字がランダムな数字を更新するタイミングを調整する部分で、 60000 ミリ秒 = 1分
間隔で更新するという内容になっています。この部分の数字を調整することで、ランダムな数字を更新するタイミングを調整することができます。また、後でロールアップを使って最大値などを抽出するために toNumber
関数を使っています。
toNumber((floor(timestamp(now()) / 60000) * toNumber(replaceAll(id(), "[^0-9]", ""))) % 1000)
上記の関数を使用することで、以下のようにランダムな数字が生成されます。
続いて、「サンプル_DB_ID抽出用」データベースから「サンプル_DB_日記」データベースをリレーションし、「Random ID」プロパティをロールアップして最大値を選択します(リレーションするときに「サンプル_DB_日記」データベースにもリレーションプロパティが表示されるように設定しておきます。)
以下が上記の設定が完了したデータベースです。ちなみに「サンプル_DB_ID抽出用」データベースの「説明用_RandomID一覧」は理解しやすいように準備したので運用上は不要です。
このあとに「サンプル_DB_日記」データベースからロールアップで「RandomID_最大値」の数字を参照できるように、「RandomID_最大値」を参照するのみの関数プロパティ「RandomID_最大値_F」プロパティを作っておきます。
以下が、ここまでの「サンプル_DB_ID抽出用」データベースの内容です。
続いて、「サンプル_DB_日記」データベースから「サンプル_DB_ID抽出用」データベースをリレーションし、「RandomID_最大値_F」プロパティをロールアップします。
これで、フィルタのための準備は完了です。あとはフィルタをかけやすいように、フィルタ用の関数(チェックボックス)を作成します。具体的には、「RandomID」プロパティと「RandomID_最大値_F」が等しい場合にのみチェックを ON にする「表示する」プロパティを作成します。
※「RandomID_最大値_F」は toNumber
関数で数字に変換しています。
これでデータベースは完成です。
「表示する」プロパティが「チェックあり」というフィルタ設定をすると、ランダムに 1件のみ表示することができました。
最後に新しく日記を書いたときに設定が自動で反映されるようにテンプレートに設定をしておきます。データベースのテンプレート設定画面で、「サンプル_DB_ID抽出用」プロパティに「ID抽出用」を選択しておきます。あとはこのテンプレートを「デフォルト」に設定しておくことで、新しく書いた日記がランダム表示の対象になります。
(テンプレートを使用する他にも、データベースのフィルタ設定を活用し、「サンプル_DB_ID抽出用」プロパティで「ID抽出用」を選択済みのビューを用意しておく方法もあります。)
ランダムに 2件表示する場合
ランダムに 2件表示する場合は、ロールアップで「Random ID」を抽出する場合に 「最大」「最小」の 2つのプロパティを用意して上記と同じ手順で進めていけば、2件をランダムに表示することができます。
以下では、「最大✅」プロパティと「最小✅」プロパティにチェックが入っている項目をランダムに抽出できています。
ランダムに 3件以上表示する場合
3 件以上表示する場合は、ランダムな ID のプロパティを二つ準備する必要があります。2つ目のランダムな ID プロパティは、以下のような関数で準備できます。
toNumber((floor(timestamp(now()) / 60000) * toNumber(slice(replaceAll(id(), "[^0-9]", ""), 1))) % 1000)
ポイントは、 slice
関数を使っている点です。もし 3つ目、4つ目とランダムな ID プロパティを増やしたい場合は、 slice
関数の引数の 1
を、 2
、 3
と変更してください。
あとは、上記と同じようにロールアップで最大、最小を抽出して同様の手順で進めることでランダムに抽出する件数を増やすことができます(ただし、抽出するページが被って抽出する件数が減ることがあります)。
以下では、チェックがついた 4ページにフィルタを書けることで、ランダムに 4ページを表示できます。
おわりに
今回は、「データベースでランダムに 1件だけ表示する」方法を解説しました。かなりマニアックな内容でしたが、もしかしたら必要な場面が出てくるかもしれないので、その時にこの記事の存在を思い出して見返していただければと思います。
今回の方法の検証は @crossma64 さんにご協力いただきました。また、ランダムな数字を抽出する方法は、以下のページを参考にさせていただきました。ありがとうございました。
参考