QRコードベースのオンライン入退室管理システム

# Introduction
今回の騒動で，研究室内の入室人数を非接触で可視化するシステムが必要になったため，
Googleアカウントを持っていれば誰でもwebアプリが無料で作れちゃう，**Google Apps Script（GAS）**を使って簡単なwebアプリケーションを作成しました

サンプルは[こちら](https://script.google.com/a/keio.jp/macros/s/AKfycbyx5Se-VGLI4hXxTJzO7RqUC_OKMA9NX6KvQl4vnA/exec?p=index)をクリックして確認してください


![入退室管理システム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/18697c8d-8f04-da6e-7392-d83431a65a4e.png)


### 特徴
 * QRコードを読み込むだけで，入退室処理が可能
 * 部屋内の人数をオンラインで管理することができる

### プログラミング言語
フロント；HTML, CSS, JavaScript … CSSはBootstrapを使用しています
バック；JavaScript
データベース；Google Spread Sheet


### ソースコード
非エンジニアの方にとりあえず作って貰う，という状況を念頭に置いて本エントリを作成いたしました．そのため，大まかな作成方法の流れのみ説明しソースコードやアルゴリズムはここで触れません．

本体はGithubで配布しています．MITライセンスなので，[こちら](https://github.com/t-morik/ACCESS_MANAGEMENT_SYSTEM)からソースコードをコピペして自由に利用してください．

# Main
## 目次
1. [Google Spread Sheetを作成する](https://qiita.com/t-morik/items/a6c73e5aff17a52cc104#1google-spread-sheet%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
2. [GASでwebアプリを作成し公開する](https://qiita.com/t-morik/items/a6c73e5aff17a52cc104#2gas%E3%81%A7web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B)
3. [編集したwebアプリを更新する](https://qiita.com/t-morik/items/a6c73e5aff17a52cc104#3%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%9Fweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B)
4. [作成したURLを元に，QRコードを生成する](https://qiita.com/t-morik/items/a6c73e5aff17a52cc104#4%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9Furl%E3%82%92%E5%85%83%E3%81%ABqr%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B)


### フォルダ構成
ちなみに，最終的には以下のようなフォルダ構成になります．
なんとなく，把握しておいてもらえるとありがたいです．

```
sample //project名
├ main.gs //JavaScriptでバックの関数を定義
├ index.html //人数を動的に表示
├ in.html //入室処理を行います
├ out.html //退室処理を行います
└ error.html
```

それでは，さっそくwebアプリを作っていきましょう！！

## (1)Google Spread Sheetを作成する
資料進行の都合上，先にデータベースを使うGoogle Spread Sheetを作成し，URLを取得します

今回のGASでは，Google Spread Sheetを疑似的なデータベースとして使用します．

まず，Google Driveを開き，「新規作成」をクリックします
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/c22c2cd3-2380-51d7-d01f-12ba83d29a6c.png)

新規作成から，「Google スプレッドシート」を選択し名前を「sample_DB」（名前はなんでもよいです）に変更してください．続いて，下記のようなSpreadSheetのURLにおける ×××××××× の部分をコピペで取得し，どこかにメモしておいてください. URLは図の赤字の線で引いてある部分に記載されています．

```
https://docs.google.com/spreadsheets/d/××××××××/edit 
```
![スクリーンショット (190)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/acd07509-d217-c9bd-0065-5361248a2292.jpeg)

続いて，"A1セル"に「現在の入室人数」，”B1セル”に「条件設定用」と入力してください

そして，"A2セル"に以下の関数を入力し、"B2セル"に"0"を入力してください

```
=IF(B2<=0,0,B2)
```

（少しエンジニア寄りの話になりますので，飛ばしてもらって構いません）
今回のwebアプリケーションではソースコードを見て貰えれば分かるように，A2セルの数値をGETしてindex.htmlに動的に数値を表示し，また入退室処理時にはA2セルからGETした数値に対して演算処理した値をB2セルに格納します．同時に，A2セルを上記のIF関数でB2セルが負になっても「0以上」になるような設定にしてあげることで，「人数」が「負」になることを回避しています．

（おそらくもっと賢いやり方があるかと思いますが，ご容赦ください…笑）




## (2)GASでwebアプリを作成し公開する
(1)と同様にGoogle Driveを開き，新規作成をクリック
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/c22c2cd3-2380-51d7-d01f-12ba83d29a6c.png)

新規作成から，「その他 → Google Apps Scripts」を選択．もし，まだGoogle DriveにGASがインストールされていなかった場合は，[こちら](https://note.com/use_web_services/n/ndeae6c4eb7af)を参考にして追加してください
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/c9062700-ac6e-8944-3685-c2ba2c77b3b7.png)

GASが無事起動できれば，以下のような画面に移ります
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/8b2034e1-9ffe-52e0-bde2-b1fea3041d1a.png)

早速，プロジェクトの名前を変更してみましょう．「無題のプロジェクト」をクリックして，名前を「sample」に変更してください（名前はhogeやfoo等，なんでもよいです）．変更が終われば，「OK」をクリックしてください
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/a2afcdcf-a2e4-32f8-a312-ce3c94900fe1.png)

続いて，プロジェクトに必要なフォルダを作成します．「ファイル → New → HTMLファイル」の順でクリックして…
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/d844f3a3-dfb1-fd8f-e8e8-a90bcddc30c1.png)

「index.html」をダイアログに入力して，作成してみてください，次のような画面に移れば，成功です．
![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/d3dd3160-7a2a-45f6-7cd1-a6547dfa1abc.png)


今回のフォルダ構成は以下の通りなので，同様に，「in.html」，「out.html」，「error.html」を作成してください．上手くいけば，次のような画面になります．

```
sample //project名
├ main.gs //JavaScriptでバックの関数を定義
├ index.html //人数を動的に表示
├ in.html //入室処理を行います
├ out.html //退室処理を行います
└ error.html
```
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/f852bf36-bb79-1f98-3c51-e9c492db63ac.png)

これで，必要なファイルの構築は完了しました，続いて，Githubにあげたソースコード([こちら](https://github.com/t-morik/ACCESS_MANAGEMENT_SYSTEM))をそれぞれのファイルにコピペしてください．

(✳︎)ペーストする時には、もともとsampleプロジェクトの「.gs」や「.html」にあったカードは全部消してから、新しく貼り付けてください

まずはじめに，「main.gs」ファイルをコピペします．
**(1) Google Spread Sheetを作成する**でスプレッドシートのURLから抽出した番号を，ソースコードの5, 14, 23行目にある以下のコードの「××××××××××××」部分にペーストしてください

```
SpreadsheetApp.openById('××××××××××××')
```

続いて，「index.html」「in.html」「out.html」「error.html」ファイルをコピペしてください
コピペしたhtmlのソースコードには，以下のようなソースコードがあると思います

```
href="https://script.google.com/××××××××××××/exec?p=○○"　
//○○にはindexやin,out,errorなどが記載されています
```
htmlファイル内にある「××××××××」は，GASで作成したwebアプリの公開URLです

すなわち，webアプリを公開しURLを取得する必要があります．webアプリを公開していきましょう．

まず，「公開 → ウェブアプリケーションとして導入…」をクリックします
![スクリーンショット (187).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/1c0f1df1-3c7f-e9a8-b448-04ad96e5f108.png)

すると，ダイアログが出てくると思いますが，「Who has access to the app:」を「Anyone, even anonymous」に変更し「更新」してください．ここを，「Only myself」にすれば自分だけがアクセス可能なwebアプリになります．他の設定項目は[こちら](https://qiita.com/jesuissuyaa/items/d6c87bfe52201df94886)を参照してください．

![スクリーンショット (194)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/1db47286-3f6f-e9a2-0cc3-a62350ebf2f4.jpeg)


webアプリの公開が成功すれば，以下のようなダイアログが出てきます．
(✳︎)もし、「承認が〜ｳﾝﾀﾗｶﾝﾀﾗ」のようなダイアログがでてきましたら、[こちら](https://tonari-it.com/gas-script-approval/)を参考に承認してください

![スクリーンショット (188).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/5414d60c-80e9-b4e5-3637-737dc4628f2e.png)


生成されたURLをコピペして，先ほど説明したように以下のソースコード「××××××××」に該当する文字列を切り出し、貼り付けてください．

```
href="https://script.google.com/××××××××××××/exec?p=○○"　
//○○にはindexやin,out,errorなどが記載されています
```
これで完成です！！！


## (3)編集したwebアプリを更新する
適時，HTMLを編集して，各研究室の名前にあわせてください

たとえば，「index.html」の25行目

```html

        <div class="text-center"><h6>@○棟△号室</h6></div>
```
の「@〇棟△号室」を適当な名前（例；山田研@28棟283号室）等に変えれば，各々の部屋で管理することができます．

そして，編集した後の注意点ですが，「公開 → ウェブアプリケーションとして導入…」をクリックしてダイアログを開いたら，Project versionを必ず「**New**」に変更してから「更新」をクリックしてください
ここが，GASのよく分からないところなのですが，「New」にしないと修正点は反映されません…

![スクリーンショット (193) - コピー_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/6d0f3eea-d693-075b-a41e-1fc4a8e882ed.jpeg)


## (4)作成したURLを元に，QRコードを生成する

#### QRコードは各種無料ツールを使用して，作成してみてください．

QRコードを生み出したデンソー公式の「[クルクルManager](https://m.qrqrq.com/)」がお勧めです
![スクリーンショット (198).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647869/61f970f2-7c1f-d5f9-e3d1-1e4e1a579dd5.png)

#### 生成するURLは以下の通りです
  
 * 入口に貼るQRコードのURL
   
```
https://script.google.com/××××××××/exec?p=in
//「××××××××」は，GASで作成したwebアプリの公開URL
```
 * 出口に貼るQRコードのURL
  
```
https://script.google.com/××××××××/exec?p=out
//「××××××××」は，GASで作成したwebアプリの公開URL
```

# あとがき
今回がQiita初投稿でした．見にくいところがあれば，ぜひご指摘ください．
GASも初めて触れてみましたが，意外と疑似的には簡単なwebアプリができるのですね
ちょっと感動しました:relaxed: