🎲

Notion の機能を活用して、最高のボドゲ管理ページを作った

2022/11/04に公開

Leaner 開発チームの黒曜(@kokuyouwind)です。

先日、 Leaner 社内にボードゲーム部が立ち上がりました。以前からイベントのたびにボドゲ会が併催されていましたが、もっと頻度高くいろいろなボドゲを遊んでみたいということで毎週月曜に定例会を実施しています。

今回はボドゲ部のために Notion ページを大充実させた結果、最高のボドゲ管理ページができたので機能や実現方法などを紹介します。

機能の紹介

ボードゲーム部のページには 2 つのデータベースを置いています。

開催ログ

実施したボードゲーム会の履歴です。

開催日が決まったらここにページを作り、参加できるメンバーや遊ぶゲームを調整しています。

ページ内にはイベント時の結果写真や集合写真などを貼っています。

ちなみに自分は黄色です。土と木を抑えて道を伸ばす腹積もりでしたが、肝心の道を伸ばす先がなくボロボロでした。

ボードゲームリスト

遊んだ・遊びたいボードゲームのリストです。今回一番力を入れて整備したデータベースになっています。

リモートのメンバーが多いため、基本的には BoardGame Arena(BGA) のゲームから遊びたいものを選んでいます。

ゲームごとにプレイ時間目安・プレイ可能人数・ Like 数・イベントでのプレイ回数を表示しています。

フィルターも使えるため、「4 人で 30 分くらいのゲーム遊びたいなー」というときでもぱっと探せます。

BGA 内にも同様のフィルターがありますが、こちらは事前に興味のあるゲームを絞っておけることと、プレイ実績でも絞り込めるため「まだ遊んだことのないゲーム」「いつもみんなで遊んでる定番ゲーム」などの軸でも絞り込めるのが便利なポイントです。

実現方法

ボードゲームリストは Notion の機能をいろいろ使って実現しているため、それぞれ解説していきます。

プレイ可能人数の範囲表示

リストではプレイ可能人数を「♟ 3~7」のように表示しています。

この表記は「プレイ可能最小人数」と「プレイ可能最大人数」を入力すれば簡単に生成可能ですが、そうしてしまうと「4 人で遊べるゲーム」といったフィルタリングを行うのが困難になります。

そこで、データベース上は「プレイ可能人数」を multi-select で列挙し、すべて入力させるようにしています。

プレイ可能人数の表示はこの属性値から組み立てる必要がありますが、 multi-select の属性を props で取得するとカンマ区切りの文字列になってしまうため、単純には最小値・最大値を取得できません。

そこで multi-select が昇順に並んでいることを前提に、文字列処理でリストの先端と終端を取り出すことによって代替します。

例えば 2, 3, 4 のような文字列がある場合、先端要素はカンマより前を残せば良いため replaceAll(prop("プレイ人数"), ",.*", "") のようにすれば取得可能です。同様に終端要素は最後のカンマ以降を残せば良いため replaceAll(prop("プレイ人数"), ".*, ", "")) になります。

実際には選択されていないときや 1 つしか選択されていないときを考慮するため、 プレイ回数(表示用) は以下の Formula で実現しています。

(length(prop("プレイ人数")) == 0) ? "" : ((length(prop("プレイ人数")) == 1) ? concat("♟ ", prop("プレイ人数")) : concat("♟ ", replaceAll(prop("プレイ人数"), ",.*", ""), "~", replaceAll(prop("プレイ人数"), ".*, ", "")))

なお Notion のギャラリーレイアウトやリストレイアウトでは表示している属性の属性名が出ないため、上記のようにアイコンとなる絵文字を concat でくっつけてあげると見栄えが良くなります。

この小テクは他の属性でも使っています。

Like 数

「このゲームで遊びたい」という人には各ゲームに Like をつけてもらう運用にしています。

Like 数は ❤️ で示しています。

Like 用の person 属性を作っているので、 Like したい人はここに自分を割り当てます。

複数人指定時の person 属性値は multi-assign と同様カンマ区切りの文字列で取得できるため、以下のように「カンマの数を数えて 1 を足す」ことで人数を数えることができます。

concat("❤️ ", format(if(length(prop("Like")) > 0, length(replaceAll(prop("Like"), "[^,]", "")) + 1, 0)))

この方法は以下の記事を参考にしています。

https://biz-notion.northsand.co.jp/knowledgebase/formula-count-people

イベントでのプレイ回数

実際にイベントで遊んだ回数を 🎲 で示しています。

この回数を数えるため、「開催ログ」との間に Relation を貼っています。

「開催ログ」の「実施ゲーム」としてボードゲームリストを参照し、「ボードゲームリスト」の「開催ログ」から逆方向に参照しています。

プレイ数ではこの Relation を Rollup で集計しています。

各回でのプレイ回数を記録するのは面倒なうえ Notion での実現も難しくなるため、単純にイベントごとに 1 回として Count all しています。

ちなみに、このプレイ回数を元に「未プレイ(=0)」「遊んだ(=1)」「リピート済み(=3~4)」「定番(>4)」という Formula 属性も作り、リストレイアウトを用意しています。

こちらは「面白そうなのにやってないゲーム、こんなにあるのかー」とふんわり眺めるときに使っています。

データベース名を非表示に切り替え

細かいですが、データベースにはデフォルトでデータベース名表示がついてきます。

これはビュー切り替えの下に出るためわかりづらく、別途見出しを設けると表示が重複してしまい邪魔になります。

この表示はレイアウト設定内にある「Show database title」を切ることで表示されなくなります。

レイアウト設定内では他にも「Open pages in」でページ開く際の挙動を切り替えられたり、「Card Preview」でプレビューをカバー画像に変えたりできるので、一度ひととおり試してみるのがおすすめです。

まとめ

ボードゲーム部のページを充実させた結果、 Notion の機能や Formula ハックを試すことができました。リストの先端・終端を取る方法や Rollup の貼り方などは業務のデータベースでも活かせそうです。

今後もボードゲーム部のページを充実させて、業務外での交流を活発にしていきます。

宣伝

一緒にボードゲームで遊びながら雑談する Meety を立てているので、興味のあるかたはぜひ一緒に遊びましょう!

https://meety.net/matches/tYljgXhZxACl

リーナーテックブログ

Discussion