💌

GASでお弁当日の管理してみた~その3~

2022/07/27に公開

お弁当管理最終回です。
1、2回はGASでフォーム画面を作成、登録、編集、削除処理を行う内容でしたが、最後にLINEに通知を飛ばす処理についての内容です。

↓前回の記事
https://zenn.dev/akaneiy/articles/8a96d748290f6b

事前準備

LINE Notify

LINE Notifyを使用するため、APIトークンの発行を行います。

https://notify-bot.line.me/ja/

ログインしたら右上のユーザー名のところからマイページを開きます。
下の方にスクロールすると下記の画像のような画面になるので、「トークンを発行する」を押します。

押したらトークン名の入力と発信したいLINEグループを選択します。

トークン名はLINE通知をした際に毎回一番上に表示されるので、何の目的で使用するトークンなのか通知を受ける人にわかりやすくしておくと良いと思います。

私はよく、トークン名がメッセージに出てくることを忘れて、同じグループでLINE Notifyを使うからとトークンを使いまわし、メッセージの内容と異なるトークン名になっていると指摘されます・・
ご注意ください。


入力後に発行するボタンが有効化されます
「発行する」ボタンを押したら、トークン(長ーい文字列)が発行されて表示されますのでコピーしておきます。
※プログラム上で使用するので必ず控えておいてください!

ここまで出来たらLINE連携準備はOKです。

スプレッドシート

前回までの記事で登録済のタスクのうち、LINEで通知したいのはその日から見た「明日」のものです。
GASで処理してもいいですが、私の大好きなQUERY関数で絞り込んで発信した方が楽そうだったのでPOSTしているシートとは別に日々発信する対象の行に絞り込むシートを追加しました。


追加したシート

A1にセルに関数が入っているだけです。

=query(POST!A:C,"select A,B,C where A = date '"& TEXT(TODAY()+1,"YYYY-MM-DD")&"'")

これで発信する情報は「通知対象」シートに出力されている情報だけでOKになりました。

コード

LINE.gs
function contents() {
  //操作するスプレッドシートIDとシート名を指定して開く
  const sheet = SpreadsheetApp.openById(gasheet).getSheetByName('通知対象');
  //全データを取得するので、最終列と最終行を取得する
  const last_col = sheet.getLastColumn();  //最終列取得
  const last_row = sheet.getLastRow();     //最終行取得
  const val = sheet.getRange(1, 1, last_row, last_col).getValues();
  /*通知したいデータがない時はリターンする*/
  if(val[0][0] === "#N/A") {
    return;
  }
  let content = "";
  for(var i = 0; i < val.length; i++) {
    content += "\n◆" + val[i][1];
  }
  sendPostContent(content);
}

//APIを叩く
function sendPostContent(content) {
  //LINE Notifyで発行したトークン
  const token = ['XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'];
  const options = {
    "method": "post",
    "payload" : {"message": content },
    "headers": {"Authorization": "Bearer " + token}    
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

解説

通知対象のシートからデータの入っている部分だけ取得し、メッセージを生成してLINE発信するsendPostContent関数を呼び出しています。
上のシートのスクショのように、QUERY関数の検索条件に当てはまる行がない場合はLINE通知が必要ないのでリターンしています。

リクエストするURLはドキュメントで確認できます。


通知したいので通知系です


リクエスト方法


パラメータ

必須のパラメータはメッセージだけです。
今回はメッセージとしてタスクを発信できればOKなので最低限のパラメータで大丈夫です。

以上を確認した上で下記のようにリクエストしました。

function sendPostContent(content) {
  //LINE Notifyで発行したトークン
  const token = ['XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'];
  const options = {
    "method": "post",
    "payload" : {"message": content },
    "headers": {"Authorization": "Bearer " + token}    
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

GASでAPIリクエストを行うときは「UrlFetchApp.fetch」を使用します。
エンドポイントとヘッダーやコンテンツ等のパラメータを設定してURLと一緒に渡します。
今回はPOSTできたらOKで、自分のために作っている私も入っているグループなのでレスポンスは変数で受け取ったりしませんでした。

トリガー

翌日の準備をし始めるのはだいたい子供が寝た後の20時~21時頃かなと思ったので、contents数をトリガーセットします。


トリガー


右下の追加ボタン


詳細設定

実行する関数を選択→時間主導型→日付ベースのタイマー→時刻を選択で設定が可能です。
毎日何時何分!としっかり決めて実行したい場合はトリガーをセットするのもGASで書かないといけませんが、だいたいでいい場合はトリガーからセットするのが簡単です。

所感

LINE通知を自動化したことでみんなで予定が共有出来てとても便利になりました。
本当は登録自体を幼稚園の先生にお願いしたいところなんですけど、今はもらった紙から転記する作業はこちらで頑張っています。
間違えがあっても他の人も見ていると気付いた人が指摘してくれたり、本当に助かります。
喜んでもらえたり、身近な事を自動化するのは楽しいので、また不便に感じることを見つけたら何か作ってみようと思いました。

Discussion