スプシをAPI化して、NodeREDで勤務シフト確認用LINEbotつくってみた

LINEで日付を入力したら該当日のシフトを教えてくれるLINEbotをつくってみました。
いちいちカレンダーアプリに勤務シフトを転記しなくても使い慣れたLINEに日付を打つだけで確認できるようになったのでプロトタイプの備忘録です。
##できたもの
数字を３桁もしくは４桁で入力すると日付として認識して、該当日のシフト情報を返してくれます。
<img width="300" alt="IMG_4154.PNG" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/ee9e859a-553a-046a-0cc9-576eadc94f0d.png>
##使ったもの
[Heroku](https://jp.heroku.com/home)
[NodeRED](https://nodered.jp/)
[SSSAPI](https://sssapi.app/)
Googleスプレッドシート
※HerokuやNodeREDの設定は下記の記事を参考にしました
https://qiita.com/ukkz/items/943dfcea2e244ed4bd82
##Googleスプレッドシートでシフト表を用意
今回は元データのラベルが日本語なので、直さずにそのまま使用していますが、本来は「日付」なら「date」などと英語で表示しておく方が後のjavascriptを書く作業が楽になります。
![gsheets.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/54388a6e-3779-74a0-d954-274cfe3b0e22.jpeg)
##「SSSAPI」でGoogleスプレッドシートをAPI化する
サイトにアクセスして手順通りにすすめていけばサクッとできると思うのでここは省略します。とっても便利ですが無料プランは作れるAPI数などに制限があるのでよく確認してね。
https://sssapi.app/
##NodeREDフロー構成
上段はLINEbotを動かすためのフロー
（下段はHerokuを15分間隔で動作させるフロー。この辺の記事を参考にするとぱぱっと作れると思いますのでお試しください。）
https://qiita.com/Kakimoty_Field/items/1383c5c3352e5fa8d6af
https://qiita.com/n0bisuke/items/2bf8ad787235765f77ed
![フロー全体.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/f70c5e6c-dbb0-38dc-a1f7-4a2e759383ab.jpeg)
###1つめ：`http in`
![HTTPINノード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/dca40a4b-4a4e-2a1f-da3d-b83629c232c1.jpeg)
###2つめ：`function`
![1つ目のファンクションノード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/f67b318a-1c8b-de21-43d9-56fb1f6af9ed.jpeg)
###3つめ：`change`
![チェンジ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/4179f085-953c-19b5-e400-6bfaee47bcbc.jpeg)
###4つめ：`http request`
「SSSAPI」で取得したURLを入力する。メソッドは「GET]で！
![http request.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/c63d2b27-f23d-7507-37ce-aa2e4ab9de55.jpeg)
###5つめ：`function`
スプシのラベルが日本語のせいで['日付']のような表記になっていますが、英語で作られている場合は[date]でOKです。

```javascript
let date = msg.line.events[0].message.text;

///入力された数字が日付と一致しているか確認する
const regex = RegExp('([0-9]{1,2})\/*([0-9]{2})', 'g');
const check = regex.exec(date);

///入力された数字の月と日の間ににスラッシュを入れる
if (check) {
  date = ('00' + check[1]).slice(-2) + '/' + check[2];
} else {
 msg.payload = msg.line;

// 返信メッセージをhttp requestの結果にする
msg.payload.events[0].message.text = '４桁で数字を入力してね\n「/」がなくてもOKです！';
return msg; 
}
let result = ''
for (let i = 0; i < msg.payload.length; i++) {
    if (msg.payload[i]['日付'] === date) {
        const wday = msg.payload[i]['曜日']
        result += `${date}\t${wday}\tのシフトは\n`
        break;
    }
}
for (let i = 0; i < msg.payload.length; i++) {
  if (msg.payload[i]['日付'] === date) {
  const name = msg.payload[i]['氏名']
  const start =msg.payload[i]['開始時間']
  const end =msg.payload[i]['終了時間']
  const status =msg.payload[i]['ステータス']

///空欄が「null」になるのでそれを表示しないようにする  
  if (end==null){
      result += `${name}\t休日 \n`      
  }else if(status==null){
      result +=`${name}\t${start}-${end}\n`     
  }else{result += `${name}\t${start}-${end}${status} \n`  
  }
}
}
msg.payload = msg.line;
// 返信メッセージをhttp requestの結果にする
msg.payload.events[0].message.text = result;
return msg;
```
##6つめ：`ReplyMessage`
LINEdevelopersで作成したMessaging APIのSecretキーとAccessTokenを入力する
![ripurai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792185/79fad4bb-38e2-be88-5768-630ccb7eef32.jpeg)

#プロトタイプなので・・・
・入力した数字に該当する日付がない時は応答がない「ｼｰﾝ･･･」とします。
・長い数字を打っても途中に日付にできる部分があると読み取ってしまう
・データベースの作成が手動なので面倒

いろいろ未完状態なのですが、備忘録の為に置いておきます。