見出し画像

【GAS不要!?】チェックボックスでビンゴゲームをつくる -1

2022年最後の記事です。

Googleスプレッドシートの チェックボックス 関連ネタ をもう少しやります。

間に BYROWのメガシンカ和暦変換の記事を挟んだんで、だいぶ間が空いてしまいましたが、前のチェックボックス記事の続きです。

GASなしで実現できる チェックボックス小ネタを幾つか紹介しましたが、最後にチラッと 乱数の固定を応用することで「GASなしで ビンゴゲームが作れる!?」という話に触れました。

今回はこの GASなしで Googleスプレッドシートでビンゴゲームを作る方法を解説していきましょう。もちろんチェックボックスを活用します。

同シリーズ前回の記事



Googleスプレッドシートで作る ビンゴゲームの流れ

前提条件と完成形のイメージ

GASやプログラミングは一切なしで作るので、凝った演出・映え的なカスタマイズは無理(もしくは割愛)と思ってください。ビンゴの基本部分には対応しています。

以下のようなビンゴゲームを想定しています。

・GASは使わない
・ 反復計算、シート関数、条件付き書式、チェックボックスを利用
・オーナー1名、ユーザー最大4名 で遊べる
・一つのスプレッドシートの中で 5枚のシートを使って行う
・シート1 をビンゴマシン用とし、シート2~5を ビンゴカードとする
・ビンゴカードは 5x5 真ん中がFREEとなっているものをランダムに生成
・今出た数字、過去に出た数字は 自動でビンゴカード上で色付け
・ビンゴの数字の最大値は 25~最大75まで切り替え可能とする

リーチ!や ビンゴ!といった宣言 は数式で拾うことも出来そうですが、今回はその要素は割愛して ユーザーからの申告制としましょう。

ビジュアル(映え)に関しても、もうちょい凝ることも出来ますが、これも本題から外れるので見栄えにはあまり手を加えていません。ご自由にどうぞです。

ユーザーは4名としてますが、単純にビンゴカード シートのコピーで増やせます。ただビンゴシートを増やすごとに、計算処理・条件付き書式の処理が増えて 動きが重くなるんで注意。

もちろん ビンゴシートを紙に印刷(もしくは市販のビンゴカードを利用)してビンゴマシンだけの利用とすれば、大人数で遊ぶことも可能です。

ビンゴカードの 数字を 25~75の可変にしたのは、人数やゲーム時間に応じて調整しやすくする為です。

1~75までの24個のランダムな数字(5x5 の真ん中のFREEを 1つ除くので 25-1 )とすれば、なかなかビンゴにならないので大人数で時間長めに盛り上がりたい時に使えますし、短時間でサクっとやりたい場合は 上限数値を 25とか35 に指定すれば良いですね。

完成形の イメージはできたでしょうか?


作成の手順

以下の流れでやっていきましょう。
プログラミングは不要ですが、それなりに工数はかかります。

  1. スプレッドシートの設定で反復計算を オンにする

  2. ビンゴの大枠を作る

  3. ビンゴカードを作成する(数式)

  4. ビンゴカードを作成する(条件付き書式)

  5. ビンゴマシンを作成する(数式)

  6. ビンゴマシンを作成する(条件付き書式)

  7. 完成、テスト



1.スプレッドシートの設定で反復計算を オンにする

これはチェックボックス番外編の内容とまったく同じなので、そちらの記事を参考に設定してください。

ちなみに「反復計算」の設定は、スプレッドシートのコピーを作成した場合も引き継がれます。つまりコピーしたスプレッドシートも反復計算がONになっている状態です。

影響はないと思いますが、一応注意しておきましょう。



2.ビンゴの大枠を作る

まずは大枠を作っていきましょう。シートを1枚追加して、

シート1 ・・・ シート名を ビンゴマシン
シート2 ・・・ シート名を ユーザー1

このようにシート名を変更。ビンゴカードのユーザー用シートは4つ作りますが、完成したシートをコピーした方が楽なので それは最後の作業です。

ビンゴマシンシートの大枠を作成

さすがに、こういうのは動画でやった方が伝わりやすい気がしますね。とりあえず ビンゴマシンシートは 上記のように設定します。

まだ数式や条件付き書式は入れなくてOK。
色、セルのサイズ、文字サイズ、フォントは 好みで 調整してください。

ナンバーの最大値 を入れる T1セル は、25~75 で可変にしたいので、10刻みの  プルダウンにしておきましょう。



(余談)プルダウンの設定がサイドバーになった


T6 を選択して メニューから データ > データの入力規制 と選び、「プルダウン」を選択。

25,35,45,55,65,75

と数値を入れてエンターを繰り返し 選択肢を作成。
さらに 詳細オプションを開き、表示スタイルを 矢印 としてから 完了。

ちなみに、直近 2022年12月 の プルダウンに関するアップデートで、プルダウンの設定がダイアログから サイドバーに変更になりました。

さらにプルダウンのスタイルのデフォルトが チップ表示になったんで、旧来型のプルダウンにしたい場合は 表示スタイル 矢印とする必要があります。うーん、わかりづらい。

プルダウンの色付けは容易に出来るけど、今のところメリットをあまり感じないアップデートだな。。




このT6セルと連動したい 2か所の設定をしましょう。


ビンゴの際、今が何回目の抽選(ガラガラ)かわかるように、P列のチェックボックスの左隣(O列)に T6と連動する 連番が入るようにしましょう。

O3セルに以下の式をいれます。

=SEQUENCE(T6)

これによって1から T6で 設定した数値までの連番が 縦並びで表示されます。

同じく 今まで出た目が色付けされるゾーン も T6 に連動して数字を表示さたいので、D3セルに以下の式を入れます。

=ARRAYFORMULA(IF(SEQUENCE(8,10)>$T$6,,SEQUENCE(8,10)))

SEQUENCEで 10行 8列 に1~80までの数字を生成し、それをIF でT6より大きい場合は空白にする としています。

以下のように T6 のプルダウンと連動するか確認しておきましょう。

これで ビンゴマシンシートの大枠は 準備OK。



ビンゴカードシートの大枠を作成

次にビンゴカードシート の大枠を作っていきます。

こっちは非常にシンプルで、方眼紙のように 行・列が 見た目同じくらいのサイズになるように調整して E3:I7 を外枠で囲い ビンゴカードとします。最初から穴があく 中央の Free マス G5は最初から色付けしておきましょう。「明るい黄3」としました。

行・列を同じピクセル値にすると、見た目的にやや縦長になるので 行を 列の9割くらいのピクセル値にするといい感じです。

ユーザーの名前入力用に F1:I1をセル統合、書式中央寄せにして 薄く色付け して下線を引いておく。

ビンゴの出た目が ユーザーのシート側でも見れるように、B3:C4をセル結合し 

='ビンゴマシン'!B3

と式を入れる。

その他の見栄えは画像を参考にしていただき、お好みで調整を。不要な行、列は削除して 領域を小さくしておくと良いです。

これでビンゴカードの大枠も完成。

こっちは簡単ですね。このまま ビンゴカードを先に作っていきます。



3. ビンゴカードを作成する(数式)

いよいよビンゴカードの部分の数式を組んでいきましょう。

ここは QAでいってみましょう。
自信のある人は 数式作成にチャレンジしてみてください。

Q. ビンゴカードを 1行数式と反復計算で作るには?

条件は以下の通りです。

■ビンゴカード 作成の条件
・E3セルのみに 式を入れる
・5x5 マス(E3:I7)に ナンバーが展開される
・カードの中央 G5は ナンバーではなく Free という文字を入れる
・ナンバーは
 - 別シート(ビンゴマシンシート)の T3 (25~75)を上限とした
 - 1~上限 数値 までの 重複しないランダムな整数
・ ビンゴマシンシート の T3(カードロックのチェックボックス)が
 チェック ONの時は ビンゴカードが固定される(変動しない)

以下のような表示・動き になればOK

どうでしょう、式を作れそうでしょうか?





ここから回答




A. ビンゴカードを 1行数式と反復計算で作る

ちょっとハードルが高いので、まず 条件を緩和して簡単な式を作ってみましょう。


まずは簡単な条件で ビンゴカードを作ってみる

■ビンゴカード 簡易版の条件
・E3セルのみに 式を入れる
・5x5 マス(E3:I7)に ナンバーが展開される

カードの中央 G5は ナンバーではなく Free という文字を入れる
・ナンバーは
 - 別シート(ビンゴマシンシート)の T3 (25~75)を上限とした
 - 1~上限 数値  1~25までの 重複しないランダムな整数
・ ビンゴマシンシート の T3(カードロックのチェックボックス)が
 
チェック ONの時は ビンゴカードが固定される(変動しない)

取り消し線でいくつかの条件を一旦除外しました。
これなら少し難易度が下がったんじゃないでしょうか?

この要件は、1~25の数字を 5x5 のマスに ランダムに入れれば良いってことです。

「ランダム」ということは、乱数を使いそうだってのはわかりますよね?
でも 上限、下限を設定して ランダムな整数を返す RANDBETWEEN関数を Arrayformula と組み合わせて

=ARRAYFORMULA(IF(SEQUENCE(5,5)>0,RANDBETWEEN(1,25),))

こんな式を E3に入れてみても・・・

マスゲームっぽい 一糸乱れぬ統一感

ランダムではありますが、全てのマスに同じ数が入っちゃいます。


 同じく RANDARRAY という 乱数配列を返す関数があるので

=RANDARRAY(5,5)

こうしたところで、

ただの乱数(0から1までの間の小数)が 5x5マスに入るだけで、1~25の整数という条件にはマッチしません。


ではどうするか?

これは、1~25までの数値を 25個の 乱数を キーに並べ替えをして、それを 5列折り返しにする と考えれば良いです。 

ステップを踏んで作ると以下の流れになります。

① 1~25の縦並びの数字と 25行1列の乱数配列を用意する
② 乱数をキーに 1~25を SORTで並び替え
③ 並べ替えた 1~25の1列を5列折り返しで配置

わかりやすく 一度出力した範囲を利用した場合

① の1~25の縦並びは SEQUENCE(25)、25行1列の乱数配列は  RANDARRAY(25) とするのは、わかりますね。
※列数は省略で1という扱い

②は並び替えなので SORT関数の出番です。
画像は一度出力して範囲を指定してますが、
①の式を そのまま SORT関数に使うと

=SORT(SEQUENCE(25),RANDARRAY(25),true)

このようになります。昇順、降順は気にしなくてよいので、とりあえず true でよいでしょう。

③はちょっと難しいです。
この 1~25の数字を ランダムに並び替えた 1列 の配列を 5x5 (折り返し)にするには、Excelであれば WRAPROWS 関数 の出番ですね。

でも 残念ながら Googleスプレッドシートには これに該当する関数がないので、複数の関数を組み合わせて自作するしかありません。

といっても、この方法は 土日更新の現在進行中の「Excel 14の新関数」シリーズで紹介しています。

Arrayformula + SEQUENCE + XLOOKUP で対応できますね。

①の式をそのまま使って式をつくると

=ARRAYFORMULA(XLOOKUP(SEQUENCE(5,5),SEQUENCE(25),SORT(SEQUENCE(25),RANDARRAY(25),true)))

こうなります。

これが 25までの数値 を 5x5 にランダムに 表示する 簡易版ビンゴカード式です。

空のセルで Deleteキーを押して 乱数が変化するのを確認



可変する 上限への対応を考える

■ビンゴカード 簡易版の条件
・E3セルのみに 式を入れる
・5x5 マス(E3:I7)に ナンバーが展開される
カードの中央 G5は ナンバーではなく Free という文字を入れる
・ナンバーは
 - 別シート(ビンゴマシンシート)の T3 (25~75)を上限とした
 - 1~上限 数値  までの 重複しないランダムな整数

・ ビンゴマシンシート の T3(カードロックのチェックボックス)が
 チェック ONの時は ビンゴカードが固定される(変動しない)

先ほど除外した条件を1つ盛り込みましょう。

5x5のマスにちょうど収まる 25ではなく、1~ 35、または45と 最大75までの可変数字を上限とした場合はどうなるでしょうか?

実は、これは気にする必要はないんです。

 Arrayformula + SEQUENCE +XLOOKUP の式(最後の 5x5 の折り返し処理)で 並び替えたランダムな縦1列の数値配列の 上から25番目 までが使われるってだけなんで、35でも45でも75でも 影響はありません。

先ほど作成した式の 25 としていた箇所を ビンゴマシン シートの T6参照に変更するだけで OK

=ARRAYFORMULA(XLOOKUP(SEQUENCE(5,5),SEQUENCE('ビンゴマシン'!T6),SORT(SEQUENCE('ビンゴマシン'!T6),RANDARRAY('ビンゴマシン'!T6),true)))

ちょっと煩雑なんで、この辺りからLAMBDA化して(ラムって)いきましょう。

=LAMBDA(num,ARRAYFORMULA(XLOOKUP(SEQUENCE(5,5),SEQUENCE(num),SORT(SEQUENCE(num),RANDARRAY(num),true))))('ビンゴマシン'!T6)



ビンゴカード中央を Freeの文字にする

続いて

・カードの中央 G5は ナンバーではなく Free という文字を入れる

この条件に対応させましょう。

これも難しいことは無くて、特にこの処理に関しては ExcelでWRAPROWS関数を使う折り返し処理に慣れていると、気づきにくい部分かもしれません。

今回の 折り返し処理は、XLOOKUPの 第1引数(検索値)を SEQUENCE(5,5)で生成(ビンゴカードのマスに連番を振るイメージ)し、 並び替えした 1~最大値 を 順番に 1の箇所に1番目、2の箇所に 2番目 と入れていく動きです。

※詳しくは 過去記事参照

つまり 画像のように 中央の黄色箇所(Freeを入れたいセル)の番号 は 13 なんで 並び替えた データの13番目を参照してくるわけです。

それなら、SEQUENCE(5,5)が 13の時だけ Freeを入れるように IFで分岐させれば良いってなりますね。

=LAMBDA(num,ARRAYFORMULA(IF(SEQUENCE(5,5)=13,"Free",XLOOKUP(SEQUENCE(5,5),SEQUENCE(num),SORT(SEQUENCE(num),RANDARRAY(num),true)))))('ビンゴマシン'!T6)

まんなかに Freeがとびこんだ~。 ここでアタックチャーーンス!



チェックボックスONで ランダム表示をロックする

・ ビンゴマシンシート の T3(カードロックのチェックボックス)が チェック ONの時は ビンゴカードが固定される(変動しない)

ランダム表示のロックということで、やっと チェックボックスの出番です。ようやく前回の記事の続きって感じになってきました。

これは、まんま 前回のチェックボックス記事の乱数固定の応用です。

違うのは、シートが別って点とランダムなのが 配列というだけですが、これも普通に記述すれば問題ないです。

=IF('ビンゴマシン'!T3,{E3:I7},LAMBDA(num,ARRAYFORMULA(IF(SEQUENCE(5,5)=13,"Free",XLOOKUP(SEQUENCE(5,5),SEQUENCE(num),SORT(SEQUENCE(num),RANDARRAY(num),true)))))('ビンゴマシン'!T6))

ちょっとカッコ悪いというか、 ヘンダーソン先生的に言うなら「ノットエレガント」ですね。

LAMBDAの中に入れ込んじゃいましょう。

ビンゴカード 数式 完成版

=LAMBDA(lock,num,ARRAYFORMULA(IF(lock,E3:I7, IF(SEQUENCE(5,5)=13,"FREE",XLOOKUP(SEQUENCE(5,5),SEQUENCE(num),SORT(SEQUENCE(num),RANDARRAY(num),true))))))('ビンゴマシン'!$T$3,'ビンゴマシン'!T6)

なかなかの難易度でしたが、とりあえず ビンゴカードの数式が完成しました~。



4. ビンゴカードを作成する(条件付き書式)

数式に続いて、ビンゴカードの条件付き書式による色付けを設定しましょう。

今出た目を 色付け 強調表示する

まず ビンゴで今出た目 のマスを 目立たせる為に 

セル塗りつぶし色 ・・・ 明るいオレンジ3
文字色 ・・・ 赤

とする条件付き書式を設定しましょう。

これは 簡単ですね。

ビンゴの出た目は ビンゴマシンシートを参照して B3セルに表示させるように大枠を組んだんで、条件付き書式・カスタム数式で 範囲の開始セル(左上)の式を作成すればよいです。

範囲 E3:I7
書式ルール カスタム数式 =E3=$B$3

これでOKです。


既に出た数字を 色付けする

続いて 既に ビンゴで出た目 のマスが わかるようにする為に 

セル塗りつぶし色 ・・・ 明るい赤3

とする条件付き書式を設定しましょう。

こちらは 別シートの ビンゴマシン シート Q3:Q77 を参照し、ビンゴシートの数字が Q3:Q77 に存在する場合は 書式を適用する という設定にします。

Googleスプレッドシートの条件付き書式は、他ののシートのセルを条件に使う場合は ちょっと特殊で、 INDIRECT関数を使う必要があります。

これも過去のカレンダー番外編で触れてます。

重複チェックはCOUNTIFを使えばよいですね。

通常なら以下のカスタム数式を条件としたいところですが、

 =COUNTIF(INDIRECT("ビンゴマシン!Q3:Q77"),E3)

今回はちょっと事情がありまして、

範囲 E3:I7書式ルール カスタム数式 =E3=$B$3
書式ルール カスタム数式
 =COUNTIFS(INDIRECT("ビンゴマシン!P3:P77"),true,INDIRECT("ビンゴマシン!Q3:Q77"),E3)

このようにしておいてください。

なんで COUNTIFSにして P列の チェックボックスも条件に加えているか? これは 後で説明します。

 

ビンゴマシンカードの Q列に適当に手入力、P列のチェックボックスにチェックを入れてみてテストしましょう

きちんと色付けが反映されていればOK。

これで ビンゴカードは 完成です。



いよいよビンゴマシーンへ・・・

今回はビンゴゲームの 主に ユーザー側のビンゴカードシートの作成までを紹介しました。乱数ロックも登場しましたね。

いよいよ次回はビンゴマシンを GASなしで どのように作成するか?
ですが、申し訳ないですが 年末年始は1週お休みをいただきます。

後編(ビンゴマシン作成)は、年明けまでお待ちください!



■このシリーズの次の記事


この記事が気に入ったらサポートをしてみませんか?