LoginSignup
28
27

More than 1 year has passed since last update.

【GAS】GoogleカレンダーとLINE公式アカウントを連携して、決まった時間に「明日のごみの日」をお知らせ

Last updated at Posted at 2022-04-04

作成物

ごみの日を前日19時にお知らせするLINE bot。

目的

  • Google Apps Scriptと触れ合うこと
  • カン・ビンを捨て忘れて、悲しい気持ちにならないこと

田舎に一人で暮らすものとして、たまにしか来ない「カン・ビン・ペットボトル」を逃すと、部屋の景色が著しく悪化します。こんな時こそデジタルの力に頼りましょう。

完成イメージ

Googleカレンダーにごみの日を登録しておく (年末年始以外、ほぼ定期予定)
スクリーンショット 2022-04-04 18.50.25.png

各「ごみの日」の前日にLINEからお知らせが来る 
新規プロジェクト.png

手順

  1. Googleカレンダーを作成
  2. LINEアカウントを作成
  3. GoogleAppScirptで連携
    a. 毎朝  関数を19時に動かすためのトリガーを作成
    b. 19時 翌日のカレンダーの内容を取得し、予定があればLINEを送信
    c. 毎晩 使い終わったトリガーを削除

1. Googleカレンダーを作成

Googleカレンダー左下の「新しいカレンダーを作成」
スクリーンショット 2022-04-04 18.58.11.png

設定、カレンダーの統合のカレンダーIDをメモしておきます。
もしLINEアカウントを拡散する場合は、Googleカレンダーでごみの日を把握したい派の方のために、一般公開して誰でも利用できる設定にして、LINEアカウントと一緒に配布できるようにしておきましょう。

2. LINEアカウントを作成

こちらのシリーズが大変わかりやすいので、ご参照ください。
この記事があったからこそ、今回作成に至りました。
作成後、LINEアカウントのチャンネルトークンをメモしておきます。

3. GoogleAppScirptで連携

Googleドライブで新規ドキュメントを立ち上げます。ドキュメント自体はお好きにメモとしてお使い下さい。
上のメニュー>ツール>スクリプトエディタでGoogleAppScirptのエディタが開きます。

ペタッとコードを貼ります。(もしおかしな記述があればご指摘下さい)


/* 地域ごとに関数を設定 */
function line地域名(){
 const lineToken = 'チャネルアクセストークンを入力';
 const calendarId = 'カレンダーIDを入力';

 postToLine_( lineToken, calendarId);
}

/* 毎朝 各関数を19時に動かすためのトリガーを作成 */
function setTrigger(){
  const time = new Date();
  time.setHours(19);
  time.setMinutes(00);
  ScriptApp.newTrigger('line地域名1').timeBased().at(time).create();
  ScriptApp.newTrigger('line地域名2').timeBased().at(time).create();
}

/* 毎晩 使い終わったトリガーを削除 */
function delTrigger() {
  const triggers = ScriptApp.getProjectTriggers();
  for(const trigger of triggers){
    if(trigger.getHandlerFunction() == "line地域名1"){
      ScriptApp.deleteTrigger(trigger);
    }
    if(trigger.getHandlerFunction() == "line地域名2"){
      ScriptApp.deleteTrigger(trigger);
    }
  }
}


/* 共通関数 */
function postToLine_( lineToken, calendarId) {

  const lineUrl = 'https://api.line.me/v2/bot/message/broadcast';//共通

  //明日の日付を取得
  const date = new Date();
  date.setDate(date.getDate() + 1);

  const message = takeEventsFromCalender_(date, calendarId);
  if (!message) return; 

  const payload = {
    messages: [
      { type: 'text', text: message }
    ]
  };

  const params = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: 'Bearer ' + lineToken
    },
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(lineUrl, params);
}

function takeEventsFromCalender_(date, calendarId) {
  // カレンダーオブジェクト取得
  const calendar = CalendarApp.getCalendarById(calendarId);

  // 指定日(明日)の予定オブジェクトの配列を取得
  const events = calendar.getEventsForDay(date);

  if (events.length === 0) return;
  else if (events.length === 1) return `明日は${events[0].getTitle()}の日です`;
  else { //2つ以上の時は中黒でつなぐ処理
    // 空っぽな配列
    const newEvents = []
    for (event in events) {
      // 予定のタイトルを取得して、空配列に入れる
      newEvents.push(events[event].getTitle());
    }
    const joinedEvents = newEvents.join("・")
    return `明日は${joinedEvents}の日です`;
  }
}

2種類のトリガーを設定します。

  • 毎朝 各地域のLINE送信関数を19時に動かす、トリガー設置のためのトリガー
  • 毎晩 使い終わったトリガーを削除するためのトリガー
    スクリーンショット 2022-04-04 19.14.56.png
    スクリーンショット 2022-04-04 19.12.56.png

2種のトリガーの時間は、好きな時間帯で設定してください。午前8〜9時で設定した場合、午前8時丁度には発動せず、本当に8〜9時の間のどこかで発動します。

完成!

あとは挙動を見守って、大丈夫そうなら周りの人達に拡散します。
年度末に忘れずに、自治体のカレンダーの確認をするようにしましょう。

お世話になったリンク

ありがとうございました!!!
GASでLINEにメッセージを送るためのMessage APIの超初心者向け基礎知識
Google Apps Script で毎日決まった時刻にスクリプトを実行するトリガー設定
Googleカレンダーから予定を取得し毎朝メールでお知らせするGAS
Messaging APIリファレンス | LINE Developers ブロードキャストメッセージ

最後に、つぶやき

Google Apps Scriptという技術を通して、さっと作れてしっかり美味しい、カレイの煮つけのようなお得感を味わせて頂きました。
(技術的に超高度ではないけど、人に喜んでもらえる)

これからもじわじわ学んで、アウトプット続けたいと思います!

28
27
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
27