小児科医作成＜熱性けいれん対応LINEbot＞0,1歳育児中の方向け【GAS✖️LINE】

# はじめに
このLINEbotは、熱性けいれんが起きた時にどう対応していいか示してくれる、また熱性けいれんについての基礎知識を得ることができるように作成しました。
<img width="400" alt="熱性けいれんリッチメニュー " src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/d66ee7a7-cb5f-7a24-fcb6-5314174e720f.png">
LINEを選んだ理由は、「新規でアプリのダウンロードの必要がなく」「無料で広められ」「多くの人にとって使い慣れたアプリ」だからです。
実際に使ってみているところ
https://twitter.com/ped_yi/status/1549379500957650944

QRコードはこちらです。
<img width="200" alt="熱性けいれん対応bot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/c6452e2c-e8ff-10bb-4c0f-2910c80fea0e.png">

## 目の前で我が子が手足をがくがく、くちびるは真っ青、口から泡をふいている！？
それが自分しか家にいない時に起こったら・・・。
熱性けいれんとは、お子さん（ほとんどは6ヶ月から5歳くらいまで）が熱を出した時に起きるけいれんです。
単なる風邪をひいた時でも起こるので、どんなお子さんにも起こりえます。
特別な原因がない場合は、後遺症の残らない良性のけいれんで、時間も数分程度でおさまりますが、目の前で我が子のけいれんを見るとその数分が地獄のように長く感じます。

## 病院で医者に聞かれること
- どれくらいの時間続きましたか？
- けいれんの時手足に左右差はありましたか？
など、けいれんの時の様子を聞かれますが、正直落ち着いて観察して状況を覚えておくなんて難しいと思います。
（私も聞く側ではありながら、「すみません、パニックで全然覚えてません」と仰る親御さんの気持ちはよく分かります。）

## このLINEbotに求めること
- 実際のけいれん時
    - タップするだけでけいれん開始、頓挫（終了）の記録が残る
    - けいれん中にどうすればいいかがメッセージで来る
    - けいれん中に動画撮影を促す
    - 「必要時１１９通報」を促す（パニックの時１１９の番号意外と出てこないんです。）

## 実際の機能（リッチメニューごとに）
- けいれんがおきました（タップすると開始時刻の記録になる）
- けいれんがとまりました（タップすると終了時刻の記録になる）
- 動画撮影（ここを押してもLINEカメラが起動しますが、けいれんがおきましたのタップでも流れで出てきます）
- 熱性痙攣とは？（基礎知識の取得）
- QUIZ（上記取得の後の確認クイズ）


## こだわり
- パニック時でもアカウントが検索しやすいよう「痙攣」「けいれん」「あかさ」をアカウント名に入れた。
- とにかく操作を簡単に

## 使用上の注意
- ピン留めとかでLINEリストの上位に表示しておくといざというときに使いやすいかも！？
- LINEカメラ起動のところとかやや手間取るので、何もない時にシミュレーションをしておくのがおすすめです。

## 実際のコード
LINEbot習いたてで作ったもので、UrlFetchApp.fetchを何度も何度もコピペしていたり、汚いコードですみません。
コードとしてはシンプルで、送られてきたメッセージに対して、決まったメッセージを返信するというものです。
```javascript
//LINE Developersで取得したアクセストークンを入れる
const ACCESS_TOKEN ="アクセストークン";
//endpointのURIを定義
const line_endpoint = "https://api.line.me/v2/bot/message/reply";
const quizSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("quiz");
var questionRow = Math.floor(Math.random() * quizSheet.getLastRow());

function doPost(e) {
  const json = JSON.parse(e.postData.contents);

  //送られてきたメッセージに対して返信するトークンを取得
  const reply_token = json.events[0].replyToken;
  if (typeof reply_token === "undefined") {
    return;
  }

  if (json.events[0].type == "message") {
    //パースされたJSONからメッセージ部分を取得
    const message = json.events[0].message.text;

    if (message == "動画記録") {
      // メッセージをendpointに返信
      UrlFetchApp.fetch(line_endpoint, {
        headers: {
          "Content-Type": "application/json; charset=UTF-8",
          Authorization: "Bearer " + ACCESS_TOKEN,
        },
        method: "post",
        payload: JSON.stringify({
          replyToken: reply_token,
          messages: [
            {
              type: "text",
              text: "５分以上続く場合は119で救急車を呼んでください。",
              quickReply: {
                items: [
                  {
                    type: "action",
                    action: {
                      type: "camera",
                      label: "撮影",
                    },
                  },
                ],
              },
            },
          ],
        }),
      });
    } else if (message == "クイズ") {
      txt = quizSheet.getRange(questionRow, 1).getValue();
      UrlFetchApp.fetch(line_endpoint, {
        headers: {
          "Content-Type": "application/json; charset=UTF-8",
          Authorization: "Bearer " + ACCESS_TOKEN,
        },
        method: "post",
        payload: JSON.stringify({
          replyToken: reply_token,
          messages: [
            {
              type: "template",
              altText: "This is a buttons template",
              template: {
                type: "buttons",
                imageAspectRatio: "rectangle",
                imageSize: "cover",
                imageBackgroundColor: "#FFFFFF",
                title: "Quiz　正しい？正しくない？",
                text: txt,
                actions: [
                  {
                    type: "postback",
                    label: "答えを見る",
                    data: questionRow,
                  },
                ],
              },
            },
          ],
        }),
      });
    } else if (message == "痙攣が起きました（開始時刻）") {
      UrlFetchApp.fetch(line_endpoint, {
        headers: {
          "Content-Type": "application/json; charset=UTF-8",
          Authorization: "Bearer " + ACCESS_TOKEN,
        },
        method: "post",
        payload: JSON.stringify({
          replyToken: reply_token,
          messages: [
            {
              type: "text",
              text: "安全な場所に寝かせ、顔を横に向けてください。",
            },
            {
              type: "text",
              text:
                "動画を撮影しましょう。ご不安であれば救急車(119)を呼びましょう。",
              quickReply: {
                items: [
                  {
                    type: "action",
                    action: {
                      type: "camera",
                      label: "動画撮影",
                    },
                  },
                ],
              },
            },
          ],
        }),
      });
    } else if (message == "痙攣が止まりました（終了時刻）") {
      UrlFetchApp.fetch(line_endpoint, {
        headers: {
          "Content-Type": "application/json; charset=UTF-8",
          Authorization: "Bearer " + ACCESS_TOKEN,
        },
        method: "post",
        payload: JSON.stringify({
          replyToken: reply_token,
          messages: [
            {
              type: "text",
              text:
                "初めてのけいれんの場合、医療機関を受診しましょう。（お子さんの意識が既に戻っている場合は救急車でなくても構いません。）",
            },
          ],
        }),
      });
    } else if (message == "熱性痙攣について") {
      UrlFetchApp.fetch(line_endpoint, {
        headers: {
          "Content-Type": "application/json; charset=UTF-8",
          Authorization: "Bearer " + ACCESS_TOKEN,
        },
        method: "post",
        payload: JSON.stringify({
          replyToken: reply_token,
          messages: [
            {
              type: "text",
              text:
                "高いお熱が出た時に痙攣が起こることです。年齢は生後6ヶ月から5歳までに起きることが多いです。",
            },
            {
              type: "text",
              text:
                "起きた時は、安全な場所に寝かせ、顔を横に向かせてください（吐いたものの窒息を防ぐためです。）",
            },
            {
              type: "text",
              text:
                "5分以内におさまる場合が多いですが、ご不安な場合はもちろんすぐに救急車を呼んでも構いません。可能であれば動画を撮影しておくと病院受診した際に役に立ちます。",
            },
            {
              type: "text",
              text:
                "Instagramのアカウントをお持ちの方はこちらもご参照ください。　https://www.instagram.com/p/CdfmCwOL-ND/",
            },
          ],
        }),
      });
    }
  } else if (json.events[0].type == "postback") {
    // parseIntで文字列を数値にする
    var row = parseInt(json.events[0].postback.data);
    UrlFetchApp.fetch(line_endpoint, {
      headers: {
        "Content-Type": "application/json; charset=UTF-8",
        Authorization: "Bearer " + ACCESS_TOKEN,
      },
      method: "post",
      payload: JSON.stringify({
        replyToken: reply_token,
        messages: [
          { type: "text", text: quizSheet.getRange(row, 2).getValue() },
        ],
      }),
    });
  }

  return ContentService.createTextOutput(
    JSON.stringify({ content: "post ok" })
  ).setMimeType(ContentService.MimeType.JSON);
}

```

## quizSheetの中身
quizSheetはこんな感じです。randomにクイズが出題されているようになっており、問題数を増やしても特にコードはいじる必要はないです。
![スクリーンショット 2022-07-19 22.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/f12f3ebe-8eaa-1a14-ef47-7ee2e518ebd8.png)

## おわりに
熱性けいれんである限り（細かい診断基準などはここでは割愛します）、後遺症の残らない良性のけいれんなので、特に特別な対応をしなくても大丈夫です。
ただ、何の知識もなく、突然その状態を目の当たりにすると、とても怖い思いをされる方が多いです。
ぜひさらっとでいいので熱性けいれんについての知識を身に付け、起きた時にこのLINEbotに沿って対応していただければ幸いです。