Lineに予定を自動で送って管理しよう！


# はじめに
アドベントカレンダー5日目、担当は、桃山です。
昨日は、岡田さんのpaiza就活についての記事でした！私はpaiza就活はやっていなかったのですが、paizaやLeetCodeをテスト対策で解いていたのを思い出しました。就活頑張ってください📣！

アドベントカレンダーは2年目！あっという間の1年でした。
残る12月と、春休み、学生生活を謳歌しようと思います！

# 作るもの
今日のアドベントカレンダーでは、私の使っている便利な機能を紹介したいと思います。

カレンダーに入っている共有したい予定を、GASとLINE notifyを用いて、グループLINEに毎日通知するものです！

コードもシステムの機能も簡単ではあるので、宮治研究室の人には物足りない可能性はありますが、だからこそ便利なのでぜひやってほしい！と思い記事にさせていだきます。

※ちなみに、共有カレンダーにTimeTreeを使っていたのですが、APIが2023年12月22日(金)でサービス終了になってしまうみたいです（ ;  ; ）
今回は急遽Googleカレンダーから取ってくることにしました。便利な共有カレンダーアプリがあれば教えてください。


# システム構成

システム構成はこのようになっています

![スクリーンショット 2023-12-03 14.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705344/2370fafa-ebfc-9692-5f9e-20a151a386b5.png)
- Google App Scriptが毎日決まった時間に作動する
- カレンダーから当日の予定を取得する
- 予定をLINE Notifyに送信
- LINEグループで予定が見れる

# 実装

## カレンダーの設定
今回は、急遽Googleカレンダーに変更したため、私1人の予定をラインに転送する実装になっています。
実際に家族・友達で使う場合はファミリーカレンダーを使ったり、カレンダーを共有してもらう作業が必要になります！

[Googleファミリーカレンダー](https://support.google.com/calendar/answer/7157782?hl=ja&co=GENIE.Platform%3DDesktop)


## LINE notifyの設定
https://notify-bot.line.me/ja/

1. 上記のページから、LINEアプリで登録しているメールアドレスとパスワードでログインする
   ログインが完了し、LINE Notifyから通知が来ていればLINE Notifyとの連携は完了

1. マイページからアクセストークンの発行(開発者向け)のトークンを発行するをクリックし、連携したいグループを選択する
(今回は家族のラインに共有という想定ですが、個人のチャットに転送してリマインダーとしても活用可能です)

1. トークンがコピーできる画面が表示されるので、トークンをコピーして保持しておく
1. LINE上でLINE Notifyの公式アカウントを友達追加し、送りたいトークルーム・グループなどに招待しておく

## GAS

### コード
```js
// 1.メインの処理(ここで他の関数を呼び出し)
function notifyTodayEvents() {
  const events = getCalendar()
  console.log(events)
  var message = "今日のはなこの予定\n\n" + createMessage(events);//はなこにしていますが、自由にタイトルを変えてください
  console.log(message)
  sendMessageToLine(message);
}

// 日付の表示形式を変える関数(2のカレンダーで使用)
function formatDate(inputDate) {
  const options = {
    month: '2-digit',
    day: '2-digit',
    weekday: 'short', 
    hour: '2-digit',
    minute: '2-digit',
    hour12: false,
    timeZone: 'Asia/Tokyo',
  };
  const formattedDate = new Date(inputDate).toLocaleString('ja-JP', options);
  return formattedDate.replace(/,/g, '');
}

// 2.カレンダーの情報取得
function getCalendar() { 
  var myCalendar = CalendarApp.getCalendarById("**************");//カレンダーidはGoogleのマイカレンダーの設定から確認可能
  // var motherCalender = CalendarApp.getCalendarById("");// 他の人のカレンダーを追加すれば、その予定も送信可能
  
  // 今日の日付
  var today = new Date();
  today.setHours(0, 0, 0, 0);

  // 明日の日付
  var tomorrow = new Date(today);
  tomorrow.setDate(today.getDate() + 1);
  
  //今日のイベントを取得
  var myEvents = myCalendar.getEvents(today, tomorrow);

  var Events = []; 
  for (var i = 0; i < myEvents.length; i++) {
    var event = myEvents[i];
     //今回はイベントタイトル、時間を取得(他の情報も追加すれば取得することができます)
      var eventData = {
        title: event.getTitle(),
        startTime: event.getStartTime(),
        endTime: event.getEndTime(),
        name: "はなこ",//複数のカレンダーを追加する場合、名前を入れるとわかりやすいです
      };
      console.log(eventData)
      Events.push(eventData);
  }
  return Events;
}

//3.メッセージの作成
function createMessage(events) {
  var message = '';
  var eventsSize = events.length;

  //予定がない場合のメッセージ
  if (eventsSize === 0) {
    return message += "今日は予定がないよ";
  }

  events.forEach(function(event, index) {
    console.log("event",event)
    let title = event.title;
    let startDate = formatDate(event.startTime);
    let endDate = formatDate(event.endTime);
    let name = event.name;
    message +="名前:" + name +"\n予定:"+ title+"\n" + startDate + ' - ' + endDate ;

    if (index < eventsSize - 1) message += "\n\n";
  });

  return message;
}


// 4.LINE Notifyにメッセージを送信
function sendMessageToLine(message) {
  var url = 'https://notify-api.line.me/api/notify';
  var payload = "message=" + message;
  lineNotifyAPI(url, 'post', payload);
}

function lineNotifyAPI(url, method, payload){
  var accessToken = "*******************";//ここにLineで発行したトークンを入れる
  var headers = {
   'Authorization': 'Bearer '+ accessToken
  };
  var options = {
     "method": method,
     "headers": headers,
     "payload": payload
  };

  return UrlFetchApp.fetch(url, options);
}


```

### トリガーの設定
1. Gasのメニューからトリガーページに移動
1. トリガーを通知してほしい時間に設定する
１日１回６時から７時の間に通知するように設定しました

![トリガー設定画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705344/e129b191-6c3f-ad5a-2732-c6a06728fbb4.png)

### 実際のLINE
![実際のLINE例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705344/1520673e-d5da-b6cf-e777-6e5971bcaff4.png)

このように通知が来ます！


# まとめ

このシステムのおかげで予定の共有が便利になりました。

私はLINE Notifyを用いて、大事なメールもLINEに転送しています。
自分が困っていることなどに合わせてぜひ実装してみてください！(ChatGPTを使えばある程度の変更は対応してくれるはずです)

今年ももう少しですが、よろしくお願いします！みんなで忘年会したいですね

# 参考
- [LINE Notify](https://notify-bot.line.me/ja/)
- [Googleカレンダー](https://support.google.com/calendar/answer/2465776?hl=ja&co=GENIE.Platform%3DDesktop)
- [Googleファミリーカレンダー](https://support.google.com/calendar/answer/7157782?hl=ja&co=GENIE.Platform%3DDesktop)