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

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

https://note.com/tangra/n/nfd3cdb7cd7ef


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


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


# 完成イメージ
Googleカレンダーにごみの日を登録しておく　（年末年始以外、ほぼ定期予定）
![スクリーンショット 2022-04-04 18.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527144/8e3569ff-8337-7d2a-19d9-83ec95a90c6c.png)

各「ごみの日」の前日にLINEからお知らせが来る　
![新規プロジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527144/f591038f-8544-78d8-3da3-45a562ff548b.png)

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

### 1. Googleカレンダーを作成
Googleカレンダー左下の「新しいカレンダーを作成」
![スクリーンショット 2022-04-04 18.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527144/43865017-0a38-36a6-86ab-7ffc9dfc1951.png)

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


### 2. LINEアカウントを作成
https://tonari-it.com/gas-line-message-api-overview/

こちらのシリーズが大変わかりやすいので、ご参照ください。
この記事があったからこそ、今回作成に至りました。
作成後、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地域名１').timeBased().at(time).create();
  ScriptApp.newTrigger('line地域名２').timeBased().at(time).create();
}

/* 毎晩　使い終わったトリガーを削除 */
function delTrigger() {
  const triggers = ScriptApp.getProjectTriggers();
  for(const trigger of triggers){
    if(trigger.getHandlerFunction() == "line地域名１"){
      ScriptApp.deleteTrigger(trigger);
    }
    if(trigger.getHandlerFunction() == "line地域名２"){
      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}の日です`;
  }
}
```

２種類のトリガーを設定します。
- 毎朝　各地域のLINE送信関数を19時に動かす、トリガー設置のためのトリガー 
- 毎晩　使い終わったトリガーを削除するためのトリガー 
![スクリーンショット 2022-04-04 19.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527144/8d0293ba-96bc-2ab5-3c5e-b87b67ab4f07.png)
![スクリーンショット 2022-04-04 19.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527144/10233b5d-19cc-f638-043b-396af98c13d4.png)

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

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

## お世話になったリンク
ありがとうございました！！！
[GASでLINEにメッセージを送るためのMessage APIの超初心者向け基礎知識](https://tonari-it.com/gas-line-message-api-overview/)
[Google Apps Script で毎日決まった時刻にスクリプトを実行するトリガー設定](https://tonari-it.com/gas-trigger-set/)
[Googleカレンダーから予定を取得し毎朝メールでお知らせするGAS](https://blog.synnex.co.jp/google/gas-notification-from-google-calendar-to-email/)
[Messaging APIリファレンス | LINE Developers　ブロードキャストメッセージ](hhttps://developers.line.biz/ja/reference/messaging-api/#send-broadcast-message)

## 最後に、つぶやき

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

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