とある依頼で「重複をしない形でのオンライン投票」の環境構築を受けまして。
その覚え書きがてら、残しておこうかと思います。
簡単に書くとこんな感じ
簡単に図式化するとこんな感じです。
自分でやっててもわけわからないっすけど、ほぼこれを最初から組込してしまいます。
運営者がしなければいけないことは基本ないですが、理解のためには色々必要かなと思ったり。
というわけで、ここからはどう作っていったかというのを記録していこうかなと。
詳細な説明
フォームの構築
Googleフォームについては、説明するまでもないですよね。ここにたどり着く人なら。
一応簡単に説明すると、上記のリンククリックして、以下のボタンをクリック。
そしたら【投票コード(これ重要)】【取得したい情報】を入れてってください。
フォームは以下の観点で作ってます。
- 投票者は1人1回投票
- 投票先を選択
- 投票先に関する講評を記述
上記ができたら、「回答」をクリックして移動して、「スプレッドシートにリンク」をクリックしてください。
そうすると以下のような画面になるので、リンクするスプレッドシートを選択してください。
ここでは新規で作成します。
そうすると、以下の感じで出てきます。最後にフォームにもう一度戻って、細かい設定を弄ります。
先程のフォームの設定をクリックし、表示設定の中の以下の項目のチェックを同じにしてください。
これを行う意図は、投票を修正したい際に投票コードが無いもので再度投票してしまうことを防ぐためです。
せっかくQR読めば自身の投票コードが記述されて重複回避できるのに、そこを手動にしては色々不具合起きるかなと。
あとは確認メッセージも修正してもいいですが、そこはそこまで重要ではないです。
フォームについては、だいたいこれで終了かと思いますが、このあとまだありますので、ウィンドウ自体はそのままにしておきましょう。
投票コードについて
さて、【投票コード】というのがあったかと思います。ここの文字列で重複を回避するよう制作しています。
投票コードについては、本来であれば、半角英数・数字等を混ぜるべきでしょうが・・・
ここは簡単に半角英数大文字のみを10文字いれるということで考えましょう。
本来であれば、PythonやChatGPTで作ってしまうのが早いですが、ぼくは面倒だったのでスプシで対応しました。
重複の可能性がゼロではないですが、もしよければ使ってください。
さて、先程のスプレッドシートを開いて、上記サイトから投票コードをコピペしましょう。
そして、フォーム側にも、この文字列しか読み込ませない正規表現を設定します。
投票コードの記述式フォームの右下、3ポチ【︙】をクリックして、【回答の検証】をクリック。
そして【数値】をクリックして【正規表現】を選択。
【次を含む】をクリックして【一致する】を選択。
パターンに以下を入力し、エラーテキストには【投票コードがおかしいです。QRから再度やり直してください。】と入力。
[A-Z]{10}
ここまで来たらやっと半分くらいです。
投票用URLの作成
さてここからは、ちょっと難しい作業です。
ただ、読んでれば理解できることではありますのでぜひチャレンジしてみてください。
先程作成したGoogleフォームの画面右上、ログインアカウントの左側のサンポチ【︙】をクリックして、
【事前入力したURLを取得】をクリックすると次のような画面になります。
そうしたら、投票コードのところには【AAAAABBBBB】と入力して、リンクを取得をクリックしてください。
上記のような画面が出ますので、【リンクをコピー】をクリック。
すると、簡易的に【AAAAABBBBB】が投票コードに事前入力されたフォームが出来上がります。
さて、このコードを持って、先程の【投票フォーム】のスプレッドシートに戻りましょ。
開きましたら、投票コードと書かれたセルの右にURLをコピペします。
こんな感じになったら、次B2のセルに、以下の内容で関数を入力してください。
=SUBSTITUTE($B$1,”AAAAABBBBB”,A2)
この関数の説明としては、【AAAAABBBBB】という文字列を投票用コードに置き換え手出力するという関数になってます。
ここまででURLはできましたので、URLでOKな場合(メール等で送付する場合)はこのままでもいいと思います。
ただ今回は【会場でURLを配布し、各人の端末で投票する】というミッションがあります。
そのためにはアナログに頼る必要がありますのでURLをQR化する必要があります。
URLのQR化
これは案外簡単です。外部サービスを使えばいいので。今回は同じシート上で諸々を作成しましょう。
C2のセルに、以下の内容を記述してください。
=image(“http://chart.apis.google.com/chart?chs=200×200&cht=qr&chl=”&B2)
上記のような渓谷が出ますが、【アクセスを許可】をクリックします。
するとあら不思議、QRが全部自動生成されるではありませんか。
勿論このままでは印刷に支障もありますし、読み取れませんので、印刷専用のシートを作りましょう。
連番つけるか、投票コードを明記して作るかはご自由に。
参考までに以下のシートはこんな感じでつくりました。
- 【投票コード】シートの1列目に連番を入力(1~最後)
- 【シート2】を立ち上げ、2列だけにする
- 【投票コード】シートのA~D列をFILTER関数で条件は何も入れず、A列とD列だけを取得するよう変数指定
- 1行目は非表示、2行目以降は行サイズを【600】に、A列を【200】に、B列を【600】に指定
こんなところで、QR化までは終了です。いやーなかなか長い文章になってしまいました。画像が大半ですが。
でもあと少しです。このあとは重複削除、投票のリスト化です。
投票のリスト化
現在の状態だと、以下の感じで、再度投票した際には重複が出てしまいます。
そのため、重複回避をさせるために先程の投票コードを使います。
投票用フォームから転送したシートを利用して、整理します。
(コピペ防止のため、画像化します)
投票コードは今回のB列です。UNIQUE関数で重複をまず削除します。
その後、XLOOKUP関数で、A列に有る投票コードのデータから、検索して出します。
ここがポイントです。詳しくは、こちらを参照してください。
簡単に書くと以下の感じです
XLOOKUP(検索キー, 検索範囲, 結果の範囲, 見つからない場合の値, 一致モード, 検索モード)
- 一致モードを0(完全一致)に指定
- 検索モードを-1(最後のエントリーから検索)に指定
この設定をする意味としては、
Googleフォームからスプレッドシートへ転送される際には、記述は一列に、順番は上から下へ記録されます。
つまり下にあるデータが最新です。
なので、【最後のエントリーから検索をかけて出てくるものを出力させる】という関数を設定すれば、GASなどのスクリプトに頼らずに出力できるというわけです。
出力結果は以下の感じです。
あとは、ご随意にデータを整理して、投票結果を出力させるなりしてください。
注意点
注意点としては、フォームの投票コードを変更させないというところでしょうか。
本当は変更させないよう、こちらの感じでテキストを仕込める方法があればいいのですが…
だれか、これをうまく導入できる人がいらっしゃったら、是非教えて下さい。
お問い合わせ欄とかで送ってもらってもいいですよ。
なお、やり方を送っていただいた方で私の手柄にして良いという方には、ペイペイで少しばかりの御礼を送りますので、是非その旨もご記載ください。
参考にしたサイト
このあたりで参考にさせてもらったサイトをご紹介します。
ほぼこれのやり方なんですが、正直GASでトラブルあったらめんどくさい現場だったのと、関数ならすこしは理解できる人がいる環境だったので、今回はほぼほぼ関数のみで仕組みました。
最後に
ご挨拶文章後の1発目にしては、かなーり長い文章になりましたが、皆様いかがでしたでしょうか。
もし、書いている内容が理解できなかったり、理解できても面倒だなーと思った方は是非、以下のフォームよりご連絡ください。
なるべく早く返信します。
ではでは。