花粉症対策デジタル医療相談Botの開発　GASでユーザー毎に飛散予測を定時プッシュ

##概要
現在スギ花粉症患者さん向けに医療機関を受診しなくてもLINEで市販の医療用医薬品を使い分けることが出来るサービスを開発中です。

3月4日までCAMPFIREでテスト版ユーザー募集中です。花粉症の方は是非ご参加ください！
CAMPFIREのプロジェクトページはこちら
[LINEで花粉症の重症度や最適な市販薬がわかるデジタル医療相談【アレルナビ】](https://camp-fire.jp/projects/view/218592)

以前のQiita記事はこちら
[花粉症対策デジタル医療相談Botの開発　ユーザーIDと位置情報をFirestoreで管理](https://qiita.com/doikatsuyuki/items/375a827c8f8e9fbc4937)

ユーザーが特定した地点のピンポイント花粉飛散予測を定時にプッシュする機能を開発中なのでその辺りをまとめました。


##作成方法
**1. 気象予測API**
今回のアプリではこちらの気象APIを利用しています。
[Lifesocket](https://lab.life-socket.jp/life_socket)

**2. プログラムを作成**
気象データを取得する関数 getweather()

```js
async function getweather(userlat,userlong) {

const BASE_URL = "***************************************";
let PATH = `/location/${userlat}/${userlong}`; //緯度経度
let url = BASE_URL + PATH + "?days=7"; //7日分取得の場合
let res = await axios.get(url, {
  headers: {
    "Content-Type": "application/json",
    Accept: "application/json",
    "x-access-key": "***********************************"
  }
});
return res.data;
}
```

飛散予測をプッシュする関数pushpollen()

```js
async function pushpollen() {
  //Firebaseから位置情報データを受ける    
  let locationsRef = db.collection('locations');  
  let alllocations = locationsRef.get()
    .then(snapshot => {
      snapshot.forEach(async doc => {
        console.log(doc.id, '=>', doc.data());
        let lineId = doc.data().line_user_id;
        let userlat = doc.data().latitude;
        let userlong = doc.data().longitude;        
        if (lineId == null) {
          console.log("IDなし")
        } else {
          let item2 = await getweather(userlat,userlong);
          console.log(item2);
          let url2;
          let [date, time] = item2.Daily[1].DateTime.split("T");
          if (item2.Daily[1].Index === 0) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 1) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 2) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 3) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 4) {
            url2 ="**********";
          }

          client.pushMessage(lineId, {            
            type: "template",
            altText: "This is a buttons template",
            template: {
              type: "buttons",
              thumbnailImageUrl: url2,
              imageAspectRatio: "rectangle",
              imageSize: "cover",
              imageBackgroundColor: "#FFFFFF",
              title: `${date}${item2.PinpointName}の花粉飛散情報`,      
              text: item2.Daily[1].IndexCommentary,
              defaultAction: {
                type: "uri",
                label: "View detail",
                uri: "**********"
              },
              actions: [               
                {
                  type: "message",
                  label: "花粉症の重症度を判定",
                  text: "判定"
                }
              ]
            }
          })          
        }
      });
    })
    .catch(err => {
      console.log('Error getting documents', err);
    });  
}
```

**3. GASで定時実行**
1．GASファイルを作成
Googleにアクセスしてログイン
[Google App Script](https://script.google.com/home)
新しいプロジェクトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/9619f300-6fad-a8e2-ec1d-220d979cdec4.png)

2．コード.jsに以下のように書く

```js
function myFunction() {
UrlFetchApp.fetch("実行させたいURL/cron");
}
```
3．トリガーを追加
コード編集画面のメニューにある時計マークをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/e0eacfb6-3b9f-7651-c997-2d05a8afb9c3.png)

pushしたい時間帯に設定
（何分おきや何時間おき、毎週何曜日のこの時間なども設定できます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/bfe17a85-e63e-71a4-0d96-a0abe03f38d0.png)


**4. プログラムの書き換え**
以下を追記して定時に飛散予測をプッシュする関数pushpollen()が実行されるようにする。

```js
app.get("/cron", (req, res) => {
  pushpollen();
});
```


##完成図
定時に花粉予測がプッシュされました。
<img width="370" alt="IMG-1039.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/2a538fc5-bf42-7ba2-44b8-e1ed6603c578.jpeg">

##考察
非同期処理の理解が浅かったためユーザーID毎に異なる飛散情報をプッシュさせるまでにかなり苦労しました。定時実行に関してはGASを使うと無料で簡単にCronのように時間指定で任意のURLをリクエストできちゃうのでとても便利ですね。