GoogleカレンダーのイベントをLINEグループに投稿する

# 要件

* 月初にいくつかの月いちイベントの日程を投稿する（内容までは不要、日付がわかればよい）
* 毎日夕方に次の日に登録されているイベントがあれば投稿する（内容があれば内容も記載する）

# 使用するもの

* LineNotify
* GoogleCalendar
* GoogleAppsScript 

# 手順

## 1

[コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/detail/88)の「パーソナルアクセストークンを発行する」を投稿したいグループや1:1に対して行う。

## 2

Googleドライブのページに行き、マイドライブ⇒その他⇒アプリを追加でGoogleAppsScriptを追加する。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/156195/923de505-be8e-f6df-196f-6c92262658a2.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/156195/75193ec1-faaa-00ce-e842-61bae8f909e4.png)

## 3

マイドライブ⇒その他⇒GoogleAppsScriptでスクリプトエディタを開く

![3.png](https://qiita-image-store.s3.amazonaws.com/0/156195/afdb7b49-ba95-a8ad-3bf3-b8bfbd35dbb2.png)

## 4

以下のスクリプトに入れ替える

```js:google_calendar_line_notify.gs
var googleCalendarId = "";
var lineNotifyEndPoint = "https://notify-api.line.me/api/notify";
var accessToken = "";
var monthlyPostEventTitleInitials = "★";// 月初投稿用イベント判定用頭文字
var dayOfWeekStringList = ["日", "月", "火", "水", "木", "金", "土"];

// 毎日用のメッセージ（内容も出す）
function postDailyMessage() {
  var calendar = CalendarApp.getCalendarById(googleCalendarId); //カレンダーIDからカレンダーを取得
  if (calendar === null)
  {
    Logger.log("カレンダーが見つかりませんでした。");
    return;
  }
  
  var date = new Date();
  date.setDate(date.getDate() + 1);
  var dailyEventList = calendar.getEventsForDay(date);// 明日のイベント
  
  var baseTitle = "明日の予定";
  var message = "";
  message += baseTitle;

  for each (var event in dailyEventList)
  {
    var eventTite = event.getTitle().replace(new RegExp(monthlyPostEventTitleInitials), "");
    var eventDescription = event.getDescription();
    message += "\n" + eventTite + "\n" + eventDescription;
  }
  
  if (message === baseTitle)
  {
    return;
  }
  
  sendMessage(message);
}

// 月初用のメッセージ
function postMonthlyMessage() {
  var nowDate = new Date();

  var year = nowDate.getYear();
  var month = nowDate.getMonth();

  var startDate = new Date(year, month, 1);// 月初
  var endDate = new Date(year, month + 1, 0);// 月末

  var calendar = CalendarApp.getCalendarById(googleCalendarId); //カレンダーIDからカレンダーを取得
  if (calendar === null)
  {
    Logger.log("カレンダーが見つかりませんでした。");
    return;
  }

  var monthlyEventList = calendar.getEvents(startDate, endDate);// getEventsはstartDateを含みendDateは含まない様子

  var message = "今月の予定";
  var eventMessage = "";

  for each (var event in monthlyEventList)
  {
    var eventTite = event.getTitle();
    if ( ! eventTite || eventTite.slice(0, 1) !== monthlyPostEventTitleInitials)
    {
      continue;
    }
    eventTite = eventTite.replace(new RegExp(monthlyPostEventTitleInitials), "");
    var eventDate = event.getStartTime();// Date
    eventMessage += "\n" + eventTite + "：" + (eventDate.getMonth() + 1)  + "/" + eventDate.getDate() + "（" + dayOfWeekStringList[eventDate.getDay()] + "）";
  }
  
  message += eventMessage ? eventMessage : "登録されていません";

  sendMessage(message);
}

// メッセージ送信
function sendMessage(message) {
  var formData = {
    "message": message
  };
  var options = {
    "headers" : {"Authorization" : "Bearer " + accessToken},
    "method" : 'post',
    "payload" : formData
  };

  try
  {
    var response = UrlFetchApp.fetch(lineNotifyEndPoint, options);
  }
  catch (error)
  {
    Logger.log(error.name + "：" + error.message);
    return;
  }
    
  if (response.getResponseCode() !== 200)
  {
    Logger.log("メッセージの送信に失敗しました。");
  } 
}
```

## 5

スクリプトの`accessToken = "";`の部分に[①](#1)で取得したパーソナルアクセストークンを設定する。

## 6

スクリプトの`googleCalendarId = "";`の部分に投稿するGoogleカレンダーのIDを設定する。GoogleカレンダーのIDは下図のカレンダー画面の赤枠辺りをクリックすることで情報一覧が確認することが出来ますので、その中に表示されています。多分Gmailのアドレス等になっていると思います。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/156195/58813ab3-1d42-8fe9-78bb-e8c101cd915a.png)

## 7

Googleカレンダーにイベントを登録する。

* 月いちイベントはタイトルの頭文字を★にします。（★にしなければ月いちイベントとみなされないため、月初の投稿には含まれません）
* イベントの説明があれば入力してください、毎朝の投稿に説明も表示されます。

## 8

毎朝の投稿スクリプト（postDailyMessage）と月いちイベントの投稿スクリプト（postMonthlyMessage）に対してトリガーを設定します。
編集⇒現在のプロジェクトのトリガーから下図のように設定を行います。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/156195/307b5568-74c5-8231-450f-d28b5915c50c.png)

postDailyMessageは毎日19時から20時に実行されるようになります。（画像では）
postMonthlyMessageは毎月1日の0時から1時に実行されるようになります。

# 参考

[コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/detail/88)
https://developers.google.com/apps-script/reference/calendar/
https://developers.google.com/apps-script/reference/calendar/calendar-event
https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
https://developers.google.com/apps-script/reference/url-fetch/http-response