LoginSignup
40
57

More than 3 years have passed since last update.

GASでQRコードを使った同人頒布会向け予約システムを作った話

Last updated at Posted at 2018-05-01

はじめに

来る5/5(土)-6(日)、東京ビッグサイトで日本最大級のアナログゲーム頒布会「ゲームマーケット2018春」が開催されます。
今回ゲームマーケットに初めてサークル参加するにあたって、「『ピロロン』する予約システムを作りたいなぁ」という気持ちのもと、以下のような予約システムを開発しました。

2018/05/07 実際に使ってみた感想を追記しました。

ユーザー体験

  1. Google フォームで予約(必要事項を登録)する
  2. 予約番号(QRコード)が添付されたメールが届く
  3. 頒布会でサークルスタッフにQRコードを見せる
  4. 本人確認完了&購入する

reserview_overview.png

メリット

サークル側

  • QRコードを読み取るだけで本人確認が完了する
    • ブースに用意するのは、一般的なスマートフォンのみでOK
  • 手作業で予約数/販売数を集計する手間がなくなる
    • 予約数が設定値に達したらアラートを受け取れる

一般参加者側

  • 他人に名前を使われて予約購入される「騙り」を排除できる

アーキテクチャ

  • Google Apps Script (GAS)
  • Google スプレッドシート
  • Google フォーム

事前に用意するもの

  • macOS (or 他OSの開発環境)
  • Google アカウント
  • Node.js
  • Git

使い方

1. clasp の導入

clasp」は、Google Apps Script をローカル環境で開発するためのツールです。

  1. npm コマンドで clasp をインストールする
ターミナル
$ sudo npm install -g @google/clasp
$ clasp login
  1. ブラウザが開くので、使用する Google アカウントを選択して [許可] する
    スクリーンショット 2018-05-01 12.48.39.png

  2. ブラウザに以下のようなメッセージが表示されればOK

    Logged in! You may close this page.

  3. ブラウザで https://script.google.com/home/usersettings を開き、Google Apps Script API を有効(オン)に変更する

2. プロジェクトのクローン

  1. 以下のコマンドを実行し、GitHub からプロジェクトをクローンする
ターミナル
$ git clone https://github.com/blachocolat/reserview.git
$ cd reserview
  1. scripts/Const.js を開き、各項目を適宜修正する
scripts/Const.js
PUBLISHER_NAME = 'こぐまやん';
EVENT_NAME = 'ゲームマーケット2018春';
EVENT_SHORT_NAME = 'ゲムマ2018春';
BOOTH_IDENTIFIER = '土-E65';
PUBLISHER_SIGNATURE = Utilities.formatString(
  '%s@%s[%s]', 
  PUBLISHER_NAME, 
  EVENT_SHORT_NAME, 
  BOOTH_IDENTIFIER
);
RECEPT_START_DATE = new Date('2018-05-05T01:00:00.000Z');
RECEPT_END_DATE = new Date('2018-05-05T05:00:00.000Z');

3. フォーム/スプレッドシートの作成

  1. Google フォーム で [+] を選択し、新しいフォームを作成する
  2. [設定] > [全般] > [メールアドレスを収集する] をチェックし、 [保存] する
  3. 以下のように質問を追加する
    form_question.png

  4. [回答] > [スプレッドシートの作成] を選択し、 予約管理表 という名前で新しいスプレッドシートを [作成] する

  5. 作成したスプレッドシートを開き、シート名を 予約一覧 に変更する

  6. 予約一覧 シートに以下の列を追加(挿入)する

    • 予約番号
    • 購入日時
  7. 商品一覧 シートを追加(新規作成)し、以下のようにシートを編集する
    スクリーンショット 2018-05-01 13.49.44.png

  8. Google ドライブ を開き、マイドライブ直下に EVENT_NAME フォルダを作成する

  9. 作成したフォルダ以下に、作成したフォームおよびスプレッドシートを移動させる

4. プロジェクトのデプロイ/公開

  1. 上で作成したスプレッドシートで [ツール] > [スクリプト エディタ] を開き、適当なプロジェクト名を設定して [ファイル] > [保存] する
  2. [公開] > [ウェブ アプリケーションとして導入…] を選択し、以下のように各項目を設定して [導入] する スクリーンショット 2018-05-01 13.57.01.png

3. スクリプトエディタの URL に含まれる SCRIPT_ID をコピーする
3. [ファイル] > [プロジェクトのプロパティ] > [スクリプト ID] を SCRIPT_ID としてコピーする

  1. 上でクローンしたフォルダ直下で、以下のコマンドを実行する
ターミナル
$ clasp clone <SCRIPT_ID>
Cloned 2 files.
└─ コード.js
└─ appsscript.json
$ clasp push
└─ appsscript.json
└─ scripts/Common.js
└─ scripts/Const.js
└─ scripts/Extension.js
└─ scripts/Purchase.js
└─ scripts/Reminder.js
└─ scripts/Reservation.js
└─ templates/email_alarm.html
└─ templates/email_confirm.html
└─ templates/email_remind.html
└─ templates/purchase_already.html
└─ templates/purchase_failure.html
└─ templates/purchase_success.html
└─ templates/style.css.html
Pushed 14 files.
  1. [スクリプト エディタ] を再読み込みし、ソースコードが push されていることを確認する
  2. [編集] > [現在のプロジェクトのトリガー] を選択し、以下のようなトリガーを追加して [保存] する スクリーンショット 2018-05-01 16.10.46.png
    • remindReservations : 指定した日時に、予約商品をまだ購入していない人宛にリマインドメールを送信します(オプション)
    • onFormSubmit : フォームの送信時に、予約番号の発行および確認メールを送信します(必須)

5. 動作確認

  1. 作成したフォームを開き、 [送信] から適当な方法を選んでフォームの URL を共有する
  2. 適当にフォームを入力して [送信] すると、以下のように予約情報が 予約一覧 シートに記録され、入力したメールアドレス宛に確認メールが届く
    スクリーンショット 2018-05-01 14.51.49.png
    Screenshot_20180501-151941.png

  3. メールに添付されたQRコードをスマートフォンなどで読み取り、取得した URL をスプレッドシートのアクセス権を持つ Google アカウントで開くと、予約情報が更新される
    Screenshot_20180501-145025.png

補足(+蛇足)

  • 初回以降、ローカルで修正したソースコードを反映したいときは clasp push を実行すればOKです。
  • clasp コマンドの意味を知りたい方は、以下の参考記事をご一読することをオススメします。
  • この記事を見て、少しでもゲームマーケットに興味を持った方は、ぜひ 【土-E65】こぐまやん ブースまでお立ち寄りください(ダイマ)。

実際に使ってみて(2018/05/07 追記)

「ゲームマーケット2018春」にて、実際にこの予約システムを使ってみたので、その感想を備忘録的にメモしておきます。
なお、予約確認メールがすぐに出てこなかった場合、スプレッドシート上で予約番号or名前を検索するという運用でカバーでどうにかしました。

  • (こちらからの声かけ後を含め)QRコードを提示してくれたのは6割弱
    • 0.5割くらいの人がガラケーないしキャリアメールのため、QRコード自体を受信できていない
  • QRコードの事前準備を徹底してもらえば、手元のスプレッドシートor印刷した予約表から名前を探すよりも速く列を捌ける気がする
    • 過激派なので、待機列を「QRコードを用意した予約者列」と「当日販売(QRコードを用意していない予約者含む)and/or商品説明列」の2列に分けたい
    • ただし、100くらいのオーダー(=名前の衝突がほぼ起きないくらい)だと予約番号or名前で検索するほうが速そう?
  • 購入日時が記録されるため、予約受け取りピークを予測して、次回以降のサークルスタッフのシフト組みに活かせる?

参考記事

注意事項

  • 本プロジェクトの利用は、自己責任でお願いします。
  • 「QRコード」は、㈱デンソーウェーブの登録商標です。
40
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
57