「公式Line」を使って介護の緊急メールを職場のメール宛先へ送ってみた

# これは何
個人で色々試行錯誤して公式LINEを利用した、介護の緊急時に職場へメールを送る仕組みができたので共有＆ブラッシュアップしたいので、ご意見を是非ください！！
## 作成背景
- 職場では私用携帯が使えない時がある（データセンター訪問時とか会議中）ので、社用携帯に通知をさせたかった
- 家族の連絡手段が「LINE」なので「LINE」⇒「職場メールアドレスが受信」ができれば、私用携帯につながらないとき時の連絡経路を作っておきたかった

# 利用環境
- LINE公式アカウント
    - 自分の私用LINEアカウントで開設
- LINE Developers
    - 開設した個人のLINE公式アカウントと紐づける
- GAS（Google Apps Script）
    - gmail送信用
    - WebhookURL（サーバー）用

# 準備
## LINE公式アカウント
公式サイト通りに登録を進めていくだけ

https://entry.line.biz/start/jp/

## LINE Developers
1. LINE Developersへ登録
1. 公式アカウント開設したアカウントと紐づけ

この記事がかなりわかりやすかったです

https://first-contact.jp/blog/article/linebot/

# 構築～稼働開始
## 初期動作確認

以下のプログラムをGASに実装＆公開＆WebhookURLを設定して応答確認

```javascript
const ACCESS_TOKEN = 'ここにチャネルアクセストークン'
const REPLY_URL = 'https://api.line.me/v2/bot/message/reply';

function doPost(e) {
  let json = JSON.parse(e.postData.contents);
  let replytoken= json.events[0].replyToken;
  const userMessage = JSON.parse(e.postData.contents).events[0].message.text;
  Logger.log(json);
  if (typeof replytoken === 'undefined') {
    return;
  }
  let message = json.events[0].message.text;
  Logger.log(message);

  UrlFetchApp.fetch(REPLY_URL, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replytoken,
      'messages': [{
        'type': 'text',
        'text': '動作確認テスト',
      }],
    }),
  });
  
  return ContentService.createTextOutput(
    JSON.stringify({'content': 'post ok'})
  ).setMimeType(ContentService.MimeType.JSON);  

}
```

実行結果

![LineBot1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282719/18cf5f93-7ef8-bcaf-0127-a4b890ffca52.jpeg)

## 特定の文字に反応して返答をするように修正

```javascript
function doPost(e) {
  let json = JSON.parse(e.postData.contents);
  let replytoken= json.events[0].replyToken;
  const userMessage = JSON.parse(e.postData.contents).events[0].message.text;
  Logger.log(json);
  if (typeof replytoken === 'undefined') {
    return;
  }
  let message = json.events[0].message.text;
  Logger.log(message);

  if(userMessage == 'Help') {

    UrlFetchApp.fetch(REPLY_URL, {
      'headers': {
        'Content-Type': 'application/json; charset=UTF-8',
        'Authorization': 'Bearer ' + ACCESS_TOKEN,
      },
      'method': 'post',
      'payload': JSON.stringify({
        'replyToken': replytoken,
        'messages': [{
          'type': 'text',
          'text': '動作確認テスト',
        }],
      }),
    });
    
    return ContentService.createTextOutput(
      JSON.stringify({'content': 'post ok'})
    ).setMimeType(ContentService.MimeType.JSON);  
  }
}
```

実行結果

![LineBot2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282719/20f49217-6d6f-aae2-dc77-46e046c3a441.jpeg)

## 「リッチメニュー」を使って簡単に指定文字を送信

公式アカウントの「トークルーム管理」「リッチメニュー」でボタンを追加
⇒「テキスト」で「Help」の文字がボタンを押すだけで送信されるようにする

設定方法

![LineBot3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282719/28f51616-dec8-b6dc-8c04-df313965be38.jpeg)

![LineBot4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282719/69198092-34d4-0103-8d34-a34d9a687fbd.jpeg)

設定結果

![LineBot5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282719/8aa8f036-7908-6d31-2db5-12dd34ff48fb.jpeg)


## Gmailで職場の連絡先へ送信するようにプログラムを修正

```javascript
function doPost(e) {
  let json = JSON.parse(e.postData.contents);
  let replytoken= json.events[0].replyToken;
  const userMessage = JSON.parse(e.postData.contents).events[0].message.text;
  Logger.log(json);
  if (typeof replytoken === 'undefined') {
    return;
  }
  let message = json.events[0].message.text;
  Logger.log(message);

  if(userMessage == 'Help') {
   sendEmail();
  }

}

function sendEmail(){
  let to = "******@****.jp";
  let subject = "介護用緊急連絡";
  let body = "家族より介護の緊急連絡が入りました。";

  MailApp.sendEmail(to, subject, body);
}
```
実行結果
![LineBot6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282719/bde4783e-8644-7b93-1deb-98c771645183.jpeg)

よしできた～

# 作成した後の振り返り
- Line⇒メールの手段はいくつかある（ZapierとかのSaaSサービス）が、公式LINEなら家族も使っているので受け入れやすかった
- GAS側でCcを加えることができるので、複数人（介護関係者）に送るのができそう
- サーバーいらなくてGmailをさくっと送信できるのは「GAS」の強みだなぁ

## 改善点
1. GASのプロパティを使ってちょっとセキュリティ意識しよう、、
    - https://qiita.com/chii-08/items/c8bb24c1141eb6ede83e
2. 「MailApp.sendEmail()」⇒「UrlFetchApp.fetch()」という順番で実行させたかった、、
    - 同期処理の順番が分からなく、試行錯誤をしたがうまくいかなかったので「Gmailで職場の連絡先へ送信するようにプログラム」で運用開始
    - 以下の記事等を参考にして、「LINE」と「メール」の両方にメッセージが飛ぶようにしたい
    - https://qiita.com/tanaike/items/e6b3b43461bfdec8005b

ご精読ありがとうございました。

改善点とかこの箇所こうしたほうがいいよ随時コメントください！！