空飛ぶたまごエンジニア

韓国進出を夢見るエンジニアのブログ

ランチタイムのグループ分けを自動で行う「UnitLunch」をリリースしました

ランチタイムのグループ分けを考えるのが大変。。。自動化しないともう無理だ!

過去のデータを元に偏りがないようにグループを分けて、毎回違うメンバーとランチを食べにいきたい。そんな希望を叶えるために、自動グループ分けツール「UnitLunch」を作りました!

ユニットランチとは

私のインターン先の会社では1週間に2回、2~3人のグループに分かれて、ランチを食べに行っています。私たちをこれを「ユニットランチ」と呼んでいます。

f:id:yamataku3831:20180708023222j:plain

少人数だからこそ、仕事中には話せないプライベートな話も聞けるので本当に楽しい!まだ知らない美味しいお店との出会いも楽しみのひとつです!

楽しみだらけのユニットランチなのですが、たったひとつだけ苦労していることがありました。

それは、ユニットランチの グループ分け です。

グループ分けの難しさ

ユニットランチが始まってからすでに1年半が経過しましたが、私がグループ分けを担当しています。

グループ分けの時に気をつけていることは、 可能な限り同じグループになったことがない人を組み合わせることです。

ただ1年半も手動でグループ分けを続けていると、連続で同じ人とグループになったり、同じグループになる頻度が高くなってしまったりと、理想的な組み合わせが難しくなってきました。。。

ツールがない!!

そこで、グループ分けの作業をコンピュータに任せようとツールを探し始めました。 ただ、私が求めているようなツールがなかなか見つかりません。

そんなとき、社員の方が 過去のデータを元に偏りなくグループ分けを行うアルゴリズム について書かれた記事を共有してくださいました。

Chatbotを使ってシャッフルランチを続けた話 | GRIPHONE ENGINEER'S BLOGtech.griphone.co.jp

この記事のおかげで、どうすれば偏りなくグループ分けができるかわかりました。 あとはもう実装するだけです!ツールがないなら作ってしまいましょう!

「UnitLunch」の仕組みと使い方

仕組み

今回作成したツール「UnitLunch」では、参考記事にある 今までのマッチングデータを元に組み合わせを評価するアルゴリズム だけを採用しています。

以下のようなアルゴリズムで1グループの組み合わせを評価しています。このアルゴリズムでは、評価値が小さいほど過去に同じグループになったことがないことを示しています。

{}

$$ E_f({t,n}) = \sum_{i=1}^{N_t} \sum_{j=i+1}^{N_t} f(p_{t,i}, p_{t,j}, n) $$

$$ f(x, y, n) = \left\{ \begin{array}{} f(x,y,n-1)+1 & (n\ 回目に\ x\ と\ y\ が同じグループの場合)\\ f(x,y,n-1)×0.5 & (n\ 回目に\ x\ と\ y\ が異なるグループ\ もしくは\ いずれかが参加していない場合)\\ 0 & (n=1) \end{array} \right. $$

$$ N_t:グループ\ t\ の人数 $$

$$ p_{t,i}:グループ\ t\ の\ i\ 番目の人 $$

$$ p_{t,j}:グループ\ t\ の\ j\ 番目の人 $$

$$ n:n 回目のシャッフルランチ $$

つまり、全グループの評価値を合計した値が最小となる組み合わせが最適となるわけです。

使い方

では、使い方について説明します。

まずは Google スプレッドシート を開き、新しいスプレッドシートを作成します。

f:id:yamataku3831:20180708004602p:plain

次に画面上部にある ツール をクリックし、 スクリプトエディタ を選択します。

f:id:yamataku3831:20180708005144p:plain

Google Apps Script の画面が表示されます。

f:id:yamataku3831:20180708005458p:plain

GitHub に公開してある main.gs のコードをコピーします。

github.com

コピーしたコードを Google Apps Script のエディタ上に貼り付けて、保存します。(任意のプロジェクト名で保存してください)

f:id:yamataku3831:20180708010100p:plain

先ほど開いた Google スプレッドシート の URL をコピーして、コード内の URL 挿入部分に貼り付けてください。

f:id:yamataku3831:20180708010724p:plain

Google スプレッドシート に戻り、「メンバー情報」というシートを作成してください。
ここはユニットランチに参加しうるメンバーの情報を保存します。

メンバー情報シートに 名前ID の列を作成してください。
注意: ID は1から順に割り振ってください。

f:id:yamataku3831:20180708011507p:plain

次に「履歴」というシートを作成してください。
ここには今までのユニットランチで誰がどのチームだったかを記録します。

注意: ID 順に左詰めで名前を入力してください。ID の番号と列数が同じになるようにしてください。

f:id:yamataku3831:20180708012427p:plain

最後に「参加者」というシートを作成してください。
ここには 参加者名ID1グループの人数 を入力してください。

いちいちIDを調べるのは面倒だと思いますので、IDの列には以下の数式を入力すると良いでしょう。

=VLOOKUP($A2, 'メンバー情報'!A:B, 2, FALSE)

注意: 必要ない関数はグループ分けを実行する前に削除して下さい。

f:id:yamataku3831:20180708014118p:plain

これで準備は整いました!

グループ分けの実行

Google Apps Script の画面を開いて、 createGroup を選択し、 再生 ボタンを押して実行してください。

※ 実行すると承認を求められると思うので、許可してください。

f:id:yamataku3831:20180708014707p:plain

しばらくしてスクリプトの実行が終了したら、ページ上部の 表示 をクリックし、 ログ を選択します。

f:id:yamataku3831:20180708015404p:plain

表示される ログ を見ると、参加者IDがグループごとにまとめられています!

f:id:yamataku3831:20180708015721p:plain

最後に履歴シートに誰が同じグループだったかを入力します。
2行目が1回目のユニットランチの履歴で、以降は下の行に追記していきます。

※ 誰が同じグループだったかがわかればいいので、私は適当にアルファベットを入力しています。

f:id:yamataku3831:20180708020533p:plain

まとめ

今回は MVP(Minimum Viable Product)ということもあり、まだまだ手動で操作しなければならない作業が多いです。。。

今後改善していく部分としては、

  • グループ分けの結果をIDではなく、名前で表示するようにする
  • グループ分けの結果を履歴に自動で入力する
  • 必要なシートをワンクリックで自動生成できるようにする

などが挙げられます。

もっと使いやすくなるようどんどん改善していきます!

ランチタイムのグループ分けで困っている方は、ぜひ使ってみてください!