クリックごとに切り替わる乱数を生成するオートメーション : Notion Tips (148)

はじめに

Notion Tips の第148回目は、クリックごとに乱数を切り替えるオートメーションを解説します。元々はアンバサダーの Slack の Formula で以下のように質問があったものです。

Has anyone figured out a random number generator that's different with every button click? I've been trying with timestamps/page IDs but they require a page reload to work properly.

元々、逆引き Formula でも一定時間ごとにページ順をランダムに並び替えるには? | Notionというページを解説しています。確かに、こちらも 1分ごと、1時間ごとにページが値が変化するのですが、リロードするまでは描画は変わりませんでした。また、クリックする度に値を変化させたいという要望のため、同じ分の間は値を変化できないタイムスタンプはそのままでは利用できません。

設計指針

クリックの度に値を変化させたいということは、乱数のシード(種)をクリック毎に切り替えればいいことになります。当初、ページ ID の数値部分をシートで掛け算すればよいだろうと簡易版を生成しました。ただ、ページ ID が 5 や 0 で終わると、出てきた乱数も 5 と 0 で終わってしまってあまり嬉しくありませんでした。そこで、上に出てきた時刻も取り入れることにしました。シードを書き換えるときに最終更新時間が変化するので、その分数を使うことにしました。

シードの作成

データベースは以下のように作成しました。ここで counter というのがシードの数値です。Roll というボタンを押すとこの counter の数値が一つずつ増える仕組みです。

データベース

ボタンオートメーションは以下のようになっています。いいねボタンと同じ仕組みですね。

ボタンオートメーション

リンクの作成

0から999までの乱数を生成する数式は以下のようになりました。以前は、id の数字部分だけを取り出していましたが、最近の更新で整数値でも浮動小数点扱いされるようになったようで、有効桁数が短くなり、それを超える下の桁は全部 0 になるようになってしまいました。このため、先頭の10文字だけを有効にするように変更しています(上の逆引きも全て0値になってしまっていたので、同じように substring を追加しました)。

lets(
    idnum, id().replaceAll("[a-f]").substring(0, 10).toNumber(),
    min, prop("last updated at").minute(),
    seed, prop("_counter") + 1,
    ((idnum + min) * seed) % 1000
)

動作確認

こちらも事前に動画を X にポストしておきました。これは最終更新時刻を取り入れる前のものですが、動作的には同じものです。クリックのたびに Dice と 1000 までの乱数のどちらも更新されていることがわかります。

おわりに

今回は乱数のシードを変更することで、クリックの度に新しい乱数を生成するボタンを解説しました。今朝は早めにネタが収集できてよかったです。明日のネタもすでに提供したもらったので少し安心しています。

hkob.notion.site