【GAS】今日の予定をLINEに通知したい！

## はじめに
前回の投稿（[前回記事はこちら](https://qiita.com/minori_no_gallery/items/92370e16a9e71b877c61)）で、複数のユーザーのGoogleカレンダーの予定をスプレッドシートに表示できたので、今回はそれを朝イチにLINEで知りたいと思ったので、(興味本位で)実際にやってみました。

## 簡単な流れ
1. [GASでデプロイ](#gasでデプロイ)
1. [LINE APIの下準備](#line-apiの下準備)
1. [MessageAPIを利用する](#messageapiを利用する)
1. [コードを書いていく](#コードを書いていく)
1. [公式LINEと友達になる](#公式lineと友達になる)
1. [テスト](#テスト)
1. [前回の処理と合体(トリガー処理設定)](#前回の処理と合体トリガー処理設定)


## 実際にやっていく
### GASでデプロイ
1. App Scriptに移動
1. 右上の「デプロイ」→「新しいデプロイ」ボタンを押下する
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/c8456712-c3c3-0b56-a960-f84b63fe160b.png" width=50%>

1. モーダル画面が表示されるので、以下画像のように「歯車マーク」を押下する
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/47c1ced2-ed5d-a3d7-0cc8-010cbcab5384.png" width=70%>

1. 以下のように設定して、「デプロイ」ボタンを押下する
    - 説明：わかりやすいもの
    - 次のユーザーとして実行：自分（デフォルト）
    - アクセスできるユーザー：全員
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/3819bbf1-148f-e422-44d9-fbf85fdb5ba8.png" width=70%>

1. デプロイIDとURLが表示されます。あとで使うので、控えておく
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/1230648f-4212-f049-6c2d-0c9a5795802a.png" width=70%>
    
### LINE APIの下準備

1. こちらのURL([LINE Developres](https://developers.line.biz/ja/))からLINE Developersに新規作成/ログインする
1. トップ画面の下部までスクロールして「作成」ボタンを押下する
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/b80477ae-0efd-3703-3d16-831fa7aa1dce.png" width=70%>

1. Message APIを押下する
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/9525d5b1-2b35-babc-b4d3-1f40c6595890.png" width=70%>

1. 「LINE公式アカウントを作成する」を押下する
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/fe5a0224-4528-a6d2-81a3-365e8c987cdf.png" width=70%>

1. LINEログイン or SMS認証をする

1. 指示に従ってアカウントを作成していきます
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/2d09b2dc-bbcd-90a4-2977-3de5e466f08f.png" width=70%>
    
    - アカウント名：分かりやすいものがいいと思います
    - メールアドレス：使いたいメールアドレス
    - 会社・事業者の所在国・地域：お住まいの地域
    - 業種：個人でOKです
    - 運用目的：その他
    - 主な使い方：今回はメッセージ発信用にします

1. 「確認」を押下
1. 「完了」を押下
1. 登録が完了したので、「LINE Official Account Managerへ」を押下
1. 情報利用について同意を促されるので、「同意」を押下

### MessageAPIを利用する
1. LINE Developerのチャンネル基本設定タブの基本情報からLINE Official Account Managerに移動する
    1. トップ画面の右上にある設定を押下する
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/f9af34ce-f833-54c8-8674-3cebad18781c.png" width=70%>

    1. 左のバーの「Messaging API」を選択する
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/6e5ad50e-bca9-cb49-0e5a-444eb157b97c.png" width=50%>

    1. 「Message APIを利用する」を押下
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/326ab753-0844-5a5d-53c1-f4e3407f5dd5.png" width=70%>

    1. プロバイダーを設定する
        →先ほど作成したものでOKです
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/e80d600b-aaec-a919-9153-4c8ad99ccb97.png" width=70%>

    1. 「同意する」を押下。この後出てくるプライバシーポリシーは空欄でOKです
    1. 「OK」を押下
    1. 一旦GASに戻って、「デプロイ」→「デプロイを管理」を押下
    1. 「URL」欄のURLをコピー
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/1230648f-4212-f049-6c2d-0c9a5795802a.png" width=70%>

    1. コピーしたURLをMessage APIの「Webhook URL」にペーストして保存を押下
    1. 左のバーの「応答設定」を押下
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/4f4a7dd2-00fe-e94f-d0bf-4958deb53289.png" width=50%>

    1. 「Webhook」がオフになっているので、オンにする
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/c55bad3b-89bd-20ca-f429-b26c7270e967.png" width=70%>

1. LINE Developersに移動する
    1. 作成したMessage APIのチャンネルを押下する
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/56c0637b-490b-d90c-4f39-1c1a5dd3ffd9.png" width=70%>
    1. 「Message API設定」を押下する
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/3d4966a0-625b-6030-016e-0439f16b24ff.png" width=70%>
    1. ページの下までスクロールして「チャンネルアクセストークン」まで移動する
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/13448771-5ad5-9bb6-24b0-f83ce4546b1d.png" width=70%>
    1. 「発行」ボタンを押下する
    1. チャンネルアクセストークンが表示されるので、控えておく

### コードを書いていく
1. GASに移動 
1. 実際にコードを書いていきます
    参考先ページのコードを参考に書いていきますが、今回はLINEからのメッセージ受け取りはないので、総当たりを取捨選択&自分なりに変更して書いていきます。
    ※GASでJSONを使うのは初めてなので、拙い記載かと思いますがご了承ください。

    ```javascript
    // Message APIのチャンネルアクセストークン
    const access_token = '';
    // スプレッドシートのID スプレッドシートのURLのhttps://docs.google.com/spreadsheets/d/と/edit?gid=0#gid=0の間の値
    const id = '';
    // 送信用LINE APIのURL
    const url = 'https://api.line.me/v2/bot/message/broadcast';
    
    // シート名
    const sheet_name = 'シート1';
    const ss = SpreadsheetApp.openById(id).getSheetByName(sheet_name);
    // 最終行を取得
    var last_low = ss.getLastRow();
    
    function sendLine() {
      var post_message = '';
      post_message = outputSheet();
    
      UrlFetchApp.fetch(url, {
        'headers': {
          'Content-Type': 'application/json; charset=UTF-8',
          'Authorization': 'Bearer ' + access_token,
        },
        'method': 'post',
        'payload': JSON.stringify({
          'messages': [{
            'type': 'text',
            'text': post_message,
          }],
        }),
      });
    
      return ContentService.createTextOutput(
        JSON.stringify({
          'content': 'post ok'
          })
        ).setMimeType(
          ContentService.MimeType.JSON
        );
    }
    
    function outputSheet(){
      var message = '';
      if (last_low >= 2) {
        message += '本日の予定はこちらです。\n';
        message += '\n';
    
        for(let i = 1; i < last_low; i++){
          var schedule=ss.getRange('A'+(i+1)).getValue();
          var user=ss.getRange('B'+(i+1)).getValue();
          var start_time=ss.getRange('C'+(i+1)).getValue();
          var end_time=ss.getRange('D'+(i+1)).getValue();
    
          // メッセージに代入
          message += 'ユーザー：' + user + '\n';
          message += '開始時間：' + changeDate(start_time) + '\n';
          message += '終了時間：' + changeDate(end_time) + '\n';
          message += '予定：' + schedule + '\n';
          message += '\n';
        }
        message += '以上になります。';
      } else {
        message += '本日の予定はありません。';
      }
      return message;
    }
    ```

### 公式LINEと友達になる
1. LINE Developreに移動する
1. 作成したチャンネルに移動して、Messaging APIタブを押下
1. QRコードがあるので、それを読み取ると友達登録できます
:::note warn
今回は公式LINEを利用してその日の予定を送信してるので、QRコードやIDを第3者に教えると予定が丸見えになっちゃいます。その辺りのセキュリティももし本運用とかしていくなら今後考えていきたい。
:::


### テスト
1. 今回は前回の投稿でインポート処理をつけたので、一旦送信ボタンをスプレッドシートに表示しようと思います
    1. スプレッドシートに移動
    1. 挿入→図形描画から好きな図形を挿入します
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/1e50f0e6-cc0d-a2fa-bc65-2f2ddb96147c.png" width=70%>
    1. 今回は以下のように「送信」ボタンを挿入しました
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/6ede23f7-af6d-dd4f-f351-d5fc2e5ec5df.png" width=70%>

    1. 図形の右上の３点リーダー→スクリプトを割り当てを押下
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/71dc1a66-d11d-2480-f26a-72229c6034f0.png" width=70%>

    1. 今回作成した関数を入力して「確定」ボタンを押下
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/be3f3534-43cd-5de7-aa43-daaed387fdb8.png" width=70%>

    1. 作成した画像（僕の場合は送信ボタン）を押下して、ラインにメッセージが送信されればOK

### 前回の処理と合体(トリガー処理設定)
1. 前回作成した関数と合体させて、ついにその日の予定を決まった時刻にLINEで送信するようにしていきます
    - GASのトリガーを使う
    1. App Scriptの左のバーの「トリガー」を押下
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/0a2f57b5-b898-f362-0d1a-9daccd2167b1.png" width=50%>
    1. 右下の「トリガーを追加」ボタンを押下
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/37d7639b-745c-fb18-ed51-08aebb3d41e3.png" width=70%>
    1. 設定を以下のようにします
        - 実行する関数：(前回記事のカレンダーの予定を取得する関数)
        - 実行するデプロイを選択：Head
        - イベントのソースを選択：時間主導型
        - 事件ベースのトリガーのタイプを選択：日時ベースのタイマー
        - 時刻を選択：午前7時〜8時(この後続けてLINEに通知するトリガーを設定するため、その時刻より前ならいつでも)
        - エラー設定通知：今すぐ通知を受け取る
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918071/bcd44150-9738-4906-9053-0211568baee2.png" width=70%>
    1. 「保存」ボタンを押下
    1. 続けてLINEに通知するトリガーを設定する
        - 実行する関数：今回追加したメソッド(sendLine)
        - 実行するデプロイを選択：Head
        - イベントのソースを選択：時間主導型
        - 時刻ベースのトリガーのタイプを選択：日時ベースのタイマー
        - 時刻を選択：午前8時〜9時
        - エラー設定通知：今すぐ通知を受け取る
    :::note info
    トリガーのテスト実行したい場合は以下のようにするといいと思います
    - 時刻ベースのトリガーのタイプを選択：分ベースのタイマー
    - 時間の間隔を選択（分）：1分おき
        :::

## 最後に
今回は少し長丁場でした。疲れた。。(小声)
公式LINEの友達設定とかできないものかと調べましたが、公式側ができないとおっしゃってますね。。(以下参考)

https://help.linebiz.com/lineadshelp/s/article/L000002064?language=ja

なので、友達登録後に特定のメッセージを送信したユーザーにのみ予定を送信とか、色々工夫が必要ですね。。

## 参考文献
以下のサイトを参考にしました。ありがとうございます。

https://feynman.co.jp/it-tool-takumi/line-gas-household-accounting/

https://84office.jp/google-sheets-line-linkage/