一定時間ごとにページ順をランダムに並び替えるには?: Notion Formula 解説 (34)

はじめに

Notion Formula の第34回目は、「一定時間ごとにページ順をランダムに並び替えるには?」を解説します。実は昨日の「文字列から数値を取り出すには?」の応用技術です。この例については、こちらの逆引きで紹介しています。

数式

数式は以下のようになります。長いので1行ずつ解説しましょう。

lets(
 /* 時間を 3600000 で割り小数点以下を切り捨てたものを変数 time_num に代入 */
 time_num, (now().timestamp() / 3600000).floor(),
 /* id のうち数字以外のものを削除し、数値化したものを id_num に代入 */
 id_num, id().replaceAll("[^0-9]+", "").toNumber(),
  /* time_num と id_num の乗算結果を 1000 で割った余りを取得 */
  (time_num * id_num) % 1000
)

最初は1時間の間は同じ数字となる仕組みである time_num を作成します。最初に現在時刻(now())からその時刻を示す数値を取得する timestamp() メソッドを呼びます。この数値が1時間の間変化しないようにするために、3600秒で割り端数を切り捨てることで time_num を得ます。timestamp の返り値はミリ秒なので、3600000 で割り算しています。この値はページごとに変化がないので一つだけ表示しています。

lets(
 /* 時間を 3600000 で割り小数点以下を切り捨てたものを変数 time_num に代入 */
 time_num, (now().timestamp() / 3600000).floor(),
Name id() now().timestamp() time_num
B 2024年6月18日 22:18 1718716680000 477421

次はページの id から数値を取得します。ページの id は 32桁の16進数なので、数値としては邪魔な a から f の文字が含まれています。そこで昨日のテクニックを使います。

 /* id のうち数字以外のものを削除し、数値化したものを id_num に代入 */
 id_num, id().replaceAll("[^0-9]+", "").toNumber(),
Name id() id_num
A 043c35144f5c4420a81f513f54a8caac 43351445442081510000
B 53935ec081904cf289edab1af3f1755e 53935081904289130000
C 5b39a33369e04673b3182578272678e4 5.393336904673318e+26
D 7a474126f72c47de917129050ade2720 7.474126724791713e+23
E 17d18b83b3364b1bbb9b431fbef6fa21 171883336419431600
F 2a863f63d5ea45e7b8f9d04c28aa2483 28636354578904280000

最後に time_num と id_num の乗算を行い、1000 で割ったあまりを取得したら完成です。剰余を取らない場合、 id の大きいものが大きいままで、順序の入れ替えが起こらないです。

  /* time_num と id_num の乗算結果を 1000 で割った余りを取得 */
  (time_num * id_num) % 1000
)
Name time_num * id_num ans
A 2.0696890434403997e+25 400
B 2.574974073782762e+25 208
C 2.5748922983660404e+32 688
D 3.568305055076785e+29 112
E 8.206071435670146e+22 408
F 1.367159703941506e+25 712

この数値を使って並び替えを行うことで、表示するたびに並びが異なるビューを用意できます。ただし、リアルタイムに変化することはなく、リロードやページ最描画時だけ書き換えが起こります。なお、3600000 の部分を 60000 にすると、1分ごとに並び替え結果が変わります。

おわりに

今回は、昨日の応用で「一定時間ごとにページ順をランダムに並び替えるには?」を応用しました。完全なる乱数にはなりませんが、単語帳クイズなどの並び替え程度には問題なく使えると思います。