文系でも分かる、GASによる授業通知のLINE bot の作成 その① 〜GASを使ったLINE botの作成〜

#動機
大学生である筆者が、オンライン授業を受ける中で、毎回zoomのIDやパスワードを探すのが大変だと思いました。そこで、LINE botで10分前に授業の情報の通知が来たら便利だという考えに至りました。

※この記事では、作成の全体像と、GASとLine botの連携まで行います。

（また、自分の理解を深めるために解説も丁寧に書いていますが、読まずにコピペでガンガン進むことも可能です。）

###記事一覧
1. 文系でも分かる、GASによる授業通知のLINE bot の作成 その① 〜GASを使ったLINE botの作成〜　←今回
2. <a href="https://qiita.com/Ko001/items/27dcc474d7827e7cd9cb">文系でも分かる、GASによる授業通知のLINE bot の作成 その② 〜GASとスプレッドシートの連携、日付のフォーマット〜</a>
3. <a href="https://qiita.com/Ko001/items/c2b1367a6c935acbdfa0">文系でも分かる、GASによる授業通知のLINE bot の作成 その③</a>
4. <a href="https://qiita.com/Ko001/items/d35a74e3be452198b8f2">文系でも分かる、GASによる授業通知のLINE bot の作成 その④　〜setTriggerを使って、指定の時間にプッシュ通知を送る〜</a>

#筆者の簡単な紹介
・国際系の学部の大学４年生（留学してたので実質３年）
・GAS(Google Apps Script)を始めたのは、約4週間前
・Railsを少し勉強していて、JavaScriptは(for や ifの使い方が分かる程度）

#使用技術
・GAS
・LINE Messaging API

#要件定義
・Google スプレッドシートの時間割表を読み込む
LINE bot の動作としては、
① 所定の言葉以外が入力された場合、使い方を説明するメッセージを返信
② 「月曜4限」などと入力すると、その時間の授業の情報を返してくれる
③「次」と入力すると、1番近い授業の情報を返してくれる
④授業の１０分前に通知
※この記事では①を扱います。

![Screen Shot 2020-11-19 at 12.53.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772803/aed874ac-3607-d567-9a2d-63387396cbe0.png)


#今回やること
１、時間割表の作成（スプレッドシート）
２、LINE Bot の作成


#時間割表の作成
Google Driveに、新しいスプレッドシートを作成する。
時間割表のレイアウトは下の画像のようにする。（1行目とA列がずれると狂います。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772803/6aef0e39-6934-a4f4-9b75-d192a3aa7208.png)
A列は順に、時限の番号、始業時間、終業時間です。自分のものに合わせて変えてください。僕は5限までしか使わないので、そこまでしか時間を入れていません。

#LINE Botの作成
こちらの記事がとても丁寧でわかりやすいので、参考にしてください。GASの開き方も説明してくれています。
</br>「LINE BOTの「LINE BOTの作り方 -Messaging APIで開発編」から、「botを更新する」のところまでが、該当範囲です。

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

先のことを考えて、コードを書き換えているので、以下をコピペして今あるものと置き換えてもらえれば動きます。 
<br>見比べながらコードの意味を理解するといいと思います。

```GAS:Code.gs
var access_token = "アクセストークンを貼り付け";
// LINE Developersの「Your user ID」の部分です。後で使います。
var user_id = "LINEのユーザーID";

//To do: スプレッドシートを特定する。
function doPost(e) {
  //ラインに送られてきたメッセージを取得
  var event = JSON.parse(e.postData.contents).events[0];
  var returnMessage = "曜日と時限（半角：1〜7)を指定してね！\n次の授業が知りたいときは、「次」と入力してね！";
　//他のユーザーが使えないように設定
  if(event.source.userId == user_id){
    //返信するためのトークン取得
    var reply_token= event.replyToken;
    if (typeof reply_token === 'undefined') {
      return;
    }
　　
    //function reply の実行 
    reply(reply_token, returnMessage);
    
  }
}

function reply(reply_token, returnMessage) {
  //返信用url 元の記事では var url として定義されているところ
　var reply_url = 'https://api.line.me/v2/bot/message/reply';
  // メッセージを返信
  UrlFetchApp.fetch(reply_url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + access_token,
    },
    'method': 'post',
    'payload': JSON.stringify({
　　　　//reply_token は function doPost(e)で指定
      'replyToken': reply_token,
      'messages': [{
        'type': 'text',
　　　　　//返信されるメッセージ、function doPost(e)で指定します。
        'text': returnMessage,
      }],
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);   
}
```

アクセストークンは別のfunctionでも使うので、function replyの外に出しました。
```function reply(reply_token, returnMessage)``` のように```reply_token```と```returnMessage```をパラメータとして設定することで、 ```function doPost(e)```の中で定義している```reply_token```と```returnMessage```の値を```function reply```の中でも使うことができます。

```if(event.source.userId == user_id)```では、送られてきたメッセージのユーザーIDと自分のラインのユーザーIDを比べて、一致した時、つまり自分がメッセージを送った時のみ動作するように設定しています。これをしないと、他の人も自分の授業の情報にアクセスできてしまいます。

```UrlFetchApp.fetch(アクセスするURL, 設定)```で、返信の設定をしています。
```'text':```の後ろ（今はreturnMessageのところ）で返信したいメッセージが設定できます。今回は ```returnMessage``` という形で変数を入れて、別のところでメッセージを指定するようにしています。他のところも興味があれば、調べてみてください。

ここまでできたら、なんでもいいので、botにメッセージを送ってみましょう。「曜日と時限（半角：1〜7)を指定してね！次の授業が知りたいときは、「次」と入力してね！」と返信が返ってくるはずです。
これで、要件定義①所定の言葉以外が入力された場合、使い方を説明するメッセージを返信 が完了しました。

次の記事はこちら↓
<a href="https://qiita.com/Ko001/items/27dcc474d7827e7cd9cb">文系でも分かる、GASによる授業通知のLINE bot の作成 その② 〜GASとスプレッドシートの連携、日付のフォーマット〜</a>