[GAS×LINE] シェアハウスのLINEグループにゴミ収集日を通知してみた

こんにちは、Teddyです。

今回はGAS(Google Apps Script)の練習も兼ねて、LINE Notifyを使ってごみ収集日をシェアハウスのLINEグループにお知らせするスクリプトを作ってみました。

そもそもゴミ収集日って覚えてられないんですよね。カレンダーを毎回みるのも面倒ですし・・・でもスマホなら毎日触れているのでそこに通知が来たら忘れることも少ないだろうなーと思ったのが発端です。

利用したサービスは以下の通り。

  • LINE Notify
    LINE が提供するサービスで、簡単に通知の実装ができます。
  • Google Spreadsheet
    Google が提供するクラウド上で利用できる表計算アプリです。明日がゴミ収集日に該当するかどうかを判定するために使用します。
  • Google Apps Script
    Google が提供する11のサービスをクラウド上でスクリプトを実行することで操作できるサービスです。毎日指定時間に Spreadsheet をチェックし、該当があれば LINE Notify に Post します。

LINE Notify のアクセストークンを取得する

まずは、LINE Notifyを利用するためにアクセストークンを取得します。以下の公式サイトへアクセスします。

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

次に、LINEアカウントにログインした状態で「マイページ」へアクセスします。

ページをスクロールすると、以下のような画面が現れますので、「トークンを発行する」をクリックします。

するとダイアログが表示されます。ここで、通知する場合の名称と通知するトークルームを決定します。ここでは「ゴミ収集」という名称にします。

「発行する」ボタンをクリックすると、トークンが発行されます。忘れずにコピーしておきましょう。

Spreadsheet でゴミ収集日かどうかを判定する

Spreadsheetを利用して次の日がゴミ収集日に当たるかどうかを判断します。ゴミ収集日の表を作成して、Spreadsheetの関数を組み合わせて特定のセルに判断結果を表示させています。下記図では、G3セルとJ8~J11セルですね。

ざっくりとですがフラグの説明。

  1. 除外フラグ
    次の日がゴミ収集の除外日かどうかを表しています。僕の住んでいる地域では、年末年始はゴミ収集がお休みのため、年末年始がゴミ収集日であっても通知を除外させるために使用します。
  2. 通知フラグ
    そのゴミ種別が次の日に収集日であるかどうかを表しています。第何週目かと曜日から通知するかどうかを判断させています。例えば、「不燃ごみ」は「第1週、第3週」の「金曜日(数字でいうと6)」の場合、通知フラグが「1」になります。

GASで全部やってもいいんですが、Spreadsheetの方がエクセルのように複雑な規則性も表現でき、引っ越しなどで曜日が変更になっても対応しやすいと考えたので、GASは最小限だけの処理としました。

GASでLINEにメッセージを送信する

Spreadsheetで通知するかどうか判別できたら、GASでLINEにメッセージを送信する仕組みを作ります。Spreadsheetのメニューからスクリプトエディタを開いて実装しましょう。

コードは以下の通りです。いたってシンプルですね。Spreadsheetから判断結果を取得してLINEへ通知させています。LINE Notifyのアクセストークンは、冒頭で取得した値に置き換えてください。

コード
function sendGCNotification() {

  // 対象シートのオブジェクトを取得する
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('ごみ収集日');
  
  // 明日が除外日の場合は処理をスキップする
  var excFlag = sheet.getRange('G3').getValue();
  if (excFlag) {
    return;
  }
  
  // 通知フラグが1のゴミ種別名を抽出
  var flagDirs = {'J8':'B8', 'J9':'B9', 'J10':'B10', 'J11':'B11'};
  var texts = [];
  for (key in flagDirs) {
    var flag = sheet.getRange(key).getValue();
    if (flag == 1) {
      texts.push(sheet.getRange(flagDirs[key]).getValue());
    }
  }
  
  // 通知するべきゴミ種別がある場合、メッセージを作成してLINEへ送信
  if (texts.length > 0) {
    var target = '';
    for (i in texts) {
      target += '\n- ' + texts[i];
    }
    var message = '明日は' + target + '\nの収集日です。';
    lineNotifyPost(message);
  }
}

function lineNotifyPost(msg) {

  //LINE Notifyのアクセストークン
  var accessToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

  var message = msg;
  var options = {
    'method' : 'post',
    'headers': {
      'Authorization': 'Bearer ' + accessToken
    },
    'payload' : {
      'message': message
    }
  };
  var response = UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
  Logger.log(response);
}

自動定期実行の設定をする

最後に、定期的にスクリプトを自動実行する設定を行います。スクリプトエディタからトリガー設定ページを開いて

作成したSpreadsheetの「トリガー」を選択して新しいトリガーを作成します。

設定は以下のようにしています。実行する関数には「sendGCNotification」を指定。時間主導性で毎日午後6時~午後7時の間に実行するようにしました。

動作を確認する

毎日、時間になると指定したスクリプトが実行されます。通知フラグが1の場合、以下のようにLINEに自動通知されました。僕の場合、ほぼ毎回18:45分頃に通知が来ます。これでゴミ出し忘れが減りますね!

まとめ

今回は、GAS(Google Apps Script)を利用してLINEへ自動通知をするスクリプトを作成してみました。特に難しい設定なども不要で、簡単に実現することができました。GASを利用することでサーバーを準備する必要もなく、導入の敷居も低かったのがポイント高いです。今回はゴミ収集日の通知スクリプトを紹介しましたが、まだまだ汎用性がありそうと感じました。プログラム入門にもいいかも!?皆さんもこれを機にプログラミングに挑戦してみるのも楽しいかもしれませんね!また便利ツールなどを作成したら紹介したいと思います。ではまた。

4 COMMENTS

アバター 匿名

はじめまして。とても有用な記事をありがとうございます。こちらを参考に、似たようなゴミ収集botを作ろうと考えているのですが、差し支えなければスプレッドシートの「除外フラグ」「通知フラグ」部分の関数でどのような書き方をされているか、ヒントをいただけないでしょうか。よろしくお願いいたします。

返信する
アバター 匿名

前回コメントさせていただいた者です。早速記事でご紹介、ご教示いただきありがとうございました!大変参考になりました。無事に運用できています。ツイッターなどで広めたいと思います!助かりました!

返信する
Teddy Teddy

ご丁寧にありがとうございます。無事に運用できているようで何よりです。
今後も日常に役立つツールなどを思いついたら発信していきますので、
これからも当ブログをよろしくお願いします。

返信する

コメントを残す

メールアドレスが公開されることはありません。