見出し画像

パパママ必見!旗振り当番を忘れちゃうので自動でLine通知する

本記事はパパママ必見です!!
経緯を話すと若干ややこしいのですが、三行でまとめると以下になります。

1. 普段お世話になってる友人に恩返しできてない
2. 友人に「なにか困ってることないですか?」と直球投げる
3. Lineグループに通知される旗振り当番Botほしい、と言われる

と、こんな流れです。

ということで、12banが解決していきましょう!

背景と要件を整理

まず旗振り当番とはなにか?みなさんわかりますか?僕はわかりませんでした。これはパパママが横断歩道などで旗を振って子供の安全を守る当番のことを言うらしいです。

そしてこの友人はこの当番を忘れがちとのこと。

よって、翌日の当番が誰であるか、パパママLineグループに通知できたら忘れなさそう、というお話でした。

よってここでの要件は

- 翌日の当番を
- 平日の夜21時に
- パパママLineグループに通知する

というものです。

完成品

完成したのがこちらです
スプレッドシートで当番表を管理し、Lineグループへ翌日の当番を通知するというもの。

スプレッドシートとGAS、Line notifyを使ってるのでコストはタダ!

Lineグループへの通知

画像2

当番表をスプレッドシートで作成

スクリーンショット 2021-04-23 9.37.17

LINEへの通知はLine Notify

LINE Notifyの設定画面で通知先となるLINEグループを設定して、トークンを払い出すだけ


スクリーンショット 2021-04-23 9.44.09

スプレッドシートに当番表を作成

当番表はスプレッドシートに作成します。当番が決まるタイミングで定期的にこの当番表を修正する必要があります。

フォーマットは完成品の画像のとおりです。

処理をGASで書く

翌日の当番を取得してLINEグループへ通知する処理を書きます。

- スクリプト自体は毎日実行される
- 実行後、次のトリガーが作成される
- 平日、祝日以外であれば処理を行い、それ以外なら終了
- スプレの日付をforで翌日日付と比較して、合致したら名前を取得
- そして送信する文字列を作成してLineに送信

function main () {
 const tomorrow = new Date();
 tomorrow.setDate(tomorrow.getDate() + 1);

 // debug のために任意の日付を仕込む (year,month-1,day,hour,min,sec)
 //today = new Date (2019, 10, 4, 10, 0, 0);
 createTrigger(tomorrow);

 // 営業日であれば実行
 if (isWorkday (tomorrow) == true) {
   lineNotification(tomorrow);
 }
}

// 営業日を計算する
function isWorkday (targetDate) {
 // targetDate の曜日を確認、週末は休む (false)
 let rest_or_work = ["REST","mon","tue","wed","thu","fri","REST"]; // 日〜土
 if ( rest_or_work [targetDate.getDay ()] == "REST" ) {
   return false;
 }; 

 // 祝日カレンダーを確認する
 let calJpHolidayUrl = "ja.japanese#holiday@group.v.calendar.google.com";
 let calJpHoliday = CalendarApp.getCalendarById (calJpHolidayUrl);
 if (calJpHoliday.getEventsForDay (targetDate).length != 0) {
   // その日に予定がなにか入っている = 祝祭日 = 営業日じゃない (false)
   return false;
 } ;

 // 全て当てはまらなければ営業日 (True)
 return true;
}

function lineNotification(tomorrow) {
  /*スプレッドシートから取得した情報をLINE通知する*/
 
 //シート情報取得
 let ss = SpreadsheetApp.getActiveSpreadsheet();
 let sheet = ss.getSheetByName('旗振り当番');

 //項目設定
 let title = "明日の旗振り当番でーす!";
 let kaigyou1 = "\n";
 let kaigyou2 = "\n\n";
 // データが入っている最後の行数を取得してそれを下記変数に入れる処理作成する
 const lastARow = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
 //Logger.log(lastARow)
 tomorrow = Utilities.formatDate(tomorrow, 'Asia/Tokyo', 'yyyy/MM/dd');

 //シートからデータ取得
 for(var i = 2; i< lastARow; i++){
   var getDate = sheet.getRange(i,1).getValue(); 
   getDate = Utilities.formatDate(getDate, 'Asia/Tokyo', 'yyyy/MM/dd');
   if (tomorrow == getDate){
     let name = sheet.getRange(i,2).getValue();
     var text = '明日' + tomorrow.slice(5) + 'は' + name + 'さん!' + kaigyou1;
     break;
   }
 }
 //LINE通知関数呼び出し
 sendHttpPost_lineNotification(kaigyou2 + title + kaigyou1 + text);
}

// LINE通知関数
function sendHttpPost_lineNotification(content){
 //トークン設定
 let token = ['XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX']; 
 let options =
  {
    "method"  : "post",
    "payload" : {"message": content}, 
    "headers" : {"Authorization" : "Bearer "+ token}
  };

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

// 次回のトリガー設定
function createTrigger(next){
 next.setHours(21);
 next.setMinutes(0);
 next.setSeconds(0);
 
 // 21時に実行するトリガーを作成
 ScriptApp.newTrigger('LineBot').timeBased().at(next).create();
}


以上です!




この記事が気に入ったらサポートをしてみませんか?