はじめに
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分ごとに並び替え結果が変わります。
おわりに
今回は、昨日の応用で「一定時間ごとにページ順をランダムに並び替えるには?」を応用しました。完全なる乱数にはなりませんが、単語帳クイズなどの並び替え程度には問題なく使えると思います。