LINE×GASで作成した順番取り予約LINE Botを改良

##概要
耳鼻科の開業医をしています。先週、医院の順番取り予約システムのプロトタイプをGASを使ったLINE Botで作成しました。
[1時間で出来る　LINE×GASで順番取り予約システムの作成](https://qiita.com/doikatsuyuki/items/842b675415abd463e499)
今回こちらを改良して実際患者さんに使ってもらいました。

##実装
1.患者さんはLINEで現在の診察待ち状況が分かる
2.患者さんはLINEで診察の順番が取れる
3.スタッフはLINEで診察中患者を更新できる
4.受付時間以外は予約券が発券されない
5.休診日は予約券が発券されない
6.スタッフはLINEで発券番号と診察中患者を初期化できる

今回は4~6の機能を追加しました。

##概念図
バックエンドとしてGoogle Spread Sheetを利用し発券番号・診察中番号を管理。Google App Script(GAS）でLINE botと連携しました。
作成法はこちら
[1時間で出来る　LINE×GASで順番取り予約システムの作成](https://qiita.com/doikatsuyuki/items/842b675415abd463e499)
![「LINE Bot+APIで表現してアウトプット」　概念図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/f298bd7a-c0f0-8a5c-fca0-d185a287bf24.png)

##BOTを改良
**1.フレックスメッセージに変更**
フレックスメッセージはこちらを使うととても簡単に作成できます。
[FLEX MESSAGE SIMULATOR](https://developers.line.biz/flex-simulator/)

システム利用時間
<img width="375" alt="IMG-1197.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/65be743d-d497-5518-8f68-cb93fcc6a273.jpeg">


現在の待ち状況
<img width="375" alt="IMG-1200.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/c80656c7-894b-19ae-2825-3d6f6e5fda15.jpeg">





予約券発券
<img width="375" alt="IMG-1203.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/36eb111f-334b-8a2a-7877-884a4f29ca76.jpeg">
**2.休診日・利用時間外は発券しない**
・休診日の土曜午後と日曜は発券しないようにします。
・利用時間（8:30-11:00　14:00-16:30）外は発券しないようにします。

```js
 //現在日時を取得(HHmm形式)　例）08：30の場合、nowに0830が入る
  var today = new Date();
  var now = Utilities.formatDate(today, "Asia/Tokyo", "HHmm");
  //日月火水木金土が0~6の数字で入る
  var day = today.getDay();

  //発券（患者）
  if (userMessage === "発券") {
    if(day === 0 || day === 6 && 1400 <= now ){//日曜または土曜午後の場合
    messages[0].text = "土曜午後・日曜・祝日は休診日です";  
    }else if ((830 <= now && now < 1100) || (1400 <= now && now < 1630)) {
      // フレックスメッセージ（予約券）
      messages = [{
        "type": "flex",
        "altText": "どい耳鼻咽喉科　予約券",
        "contents": {
          "type": "bubble",
          "body": {
            "type": "box",
            "layout": "vertical",
            "contents": [
              {
                "type": "text",
                "text": "どい耳鼻咽喉科　診察予約券",
                "weight": "bold",
                "color": "#1DB446",
                "size": "sm",
                "align": "center"
              },
              {
                "type": "text",
                "text": String(getNumber()),
                "weight": "bold",
                "size": "5xl",
                "margin": "xxl",
                "align": "center"
              },
              {
                "type": "separator",
                "margin": "xxl"
              },
              {
                "type": "box",
                "layout": "vertical",
                "margin": "xxl",
                "spacing": "sm",
                "contents": [
                  {
                    "type": "box",
                    "layout": "horizontal",
                    "contents": [
                      {
                        "type": "text",
                        "text": "・こちらの画面を受付でご提示下さい",
                        "size": "sm",
                        "color": "#555555",
                        "flex": 0
                      }
                    ]
                  },
                  {
                    "type": "box",
                    "layout": "horizontal",
                    "contents": [
                      {
                        "type": "text",
                        "text": "・遅れた場合予約券は無効になります",
                        "size": "sm",
                        "color": "#555555",
                        "flex": 0
                      }
                    ]
                  },
                  {
                    "type": "box",
                    "layout": "horizontal",
                    "contents": [
                      {
                        "type": "text",
                        "text": "・こまめに【待ち状況】をご確認下さい",
                        "size": "sm",
                        "color": "#555555",
                        "flex": 0
                      }
                    ]
                  }
                ]
              },
              {
                "type": "separator",
                "margin": "xxl"
              },
              {
                "type": "box",
                "layout": "horizontal",
                "margin": "md",
                "contents": [
                  {
                    "type": "text",
                    "text": "医院電話番号",
                    "size": "xs",
                    "color": "#aaaaaa",
                    "flex": 0
                  },
                  {
                    "type": "text",
                    "text": "047-496-1133",
                    "color": "#aaaaaa",
                    "size": "xs",
                    "align": "end"
                  }
                ]
              }
            ]
          },
          "styles": {
            "footer": {
              "separator": true
            }
          }
        }
      }];
    } else {
      messages[0].text = "現在発券時間外です。受付時間は午前8:30~11:00 午後2:00~4:30です。";
    }
  }

```

**3.予約券番号・診察中番号の初期化**
予約券番号はSpredSheetのセルA1値を、診察中番号はセルB1値を読み取っています。
こちらの仕組みについてはこちら
[1時間で出来る　LINE×GASで順番取り予約システムの作成](https://qiita.com/doikatsuyuki/items/842b675415abd463e499)

特定のメッセージを受けると以下の関数が動いて、セルA1値を「1」にセルB1値を「0」に変更し初期化します。

```js
//A1セル値を1にB1セル値を0に初期化する関数
function initialA1B1() {
  //1. 現在のスプレッドシートを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //2. 現在のシートを取得
  var sheet = spreadsheet.getActiveSheet();
  //3A. 指定するセルの範囲（A1）を取得
  var rangeA = sheet.getRange("A1");
  //3B. 指定するセルの範囲（B1）を取得
  var rangeB = sheet.getRange("B1");  
  // 4.初期化：セルに値をセットする場合はsetValueを使う
  rangeA.setValue(1);
  rangeB.setValue(0);
}

```
##考察
今回実際にこのBotを患者さんに使って頂きました。土曜午前に受診した130名の患者さんのうち20-30名の方が予約システムを利用されました。特にトラブルなく運用できましたが順番に遅れる方が何名かいたようです。プッシュ機能を使い来院を呼びかけるようにすると良いのかもしれませんがすぐ無料枠を超えてしまうので何かほかに良い方法がないか考え中です。