GASとGoogleカレンダーとの連携方法

# はじめに
この記事は「[Ateam LifeDesign Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-life-design)」で完走賞を狙って25記事書いているうちの6日目の記事です。今年も完走目指して頑張るぞ！

今日はGASとGoogleカレンダーの連携についてみていきます。

# 作るもの
GASでGoogleカレンダーから今日の予定を取得してメールで送信するというものをつくります。

# GASを書いていく

```javascript
  var calendar = CalendarApp.getDefaultCalendar();
  var events = calendar.getEventsForDay(new Date()); // 今日のイベントを取得する例
```

まずはカレンダー情報を取得し、`getEventsForDay`で登録されている予定をもってきます。`getEventsForDay`では引数に指定された日付に登録されている予定を返します。今回は指定していませんが第2引数に条件をしていすることで、条件にマッチする予定だけを取得することも可能です。指定できる条件は以下の通り。

| 名前 | 型 | 説明 |
|-|-|-|
|start	|Integer|	返される最初のイベントのインデックス|
|max|	Integer|	返される最大イベント数|
|author	|String|	イベント作成者による結果のフィルタリングに使用されるメールアドレス|
|search|	String|	結果のフィルタリングに使用される全文検索クエリ|
|statusFilters[]|	[GuestStatus](https://developers.google.com/apps-script/reference/calendar/guest-status?hl=ja)|	結果のフィルタリングに使用されるステータスの配列|

```javascript
  var eventDetails = "今日のイベント:\n\n";

  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    var startTime = formatTime(event.getStartTime()); // 開始時刻を日本時間表記に変換
    var endTime = formatTime(event.getEndTime()); // 終了時刻を日本時間表記に変換

    eventDetails += "タイトル: " + event.getTitle() + "\n";
    eventDetails += "開始時刻: " + startTime + "\n";
    eventDetails += "終了時刻: " + endTime + "\n\n";
  }
```

続いて本文を作成していきます。改行コードは`\n`を使います。
先程カレンダーから取得したeventsをループで回しながら1つずつ本文に追加していきます。開始時刻と終了時刻の表記はデフォルトだとわかりにくいので日本時間表記に変換する関数を作ってそれを通すようにしています。

```javascript
// 時間を日本時間表記（HH:mm）に変換する関数
function formatTime(date) {
  var japanTime = Utilities.formatDate(date, Session.getScriptTimeZone(), "HH:mm");
  return japanTime;
}
```

この関数をつかってHH:mmの表示形式に整えます。

```javascript
  var recipient = "example@example.com"; // 送信先メールアドレスを設定
  var subject = "今日の予定";
  var body = eventDetails;

  GmailApp.sendEmail(recipient, subject, body);
```

最後に送信先のアドレス、タイトル、本文を設定して`GmailApp.sendEmail`を呼び出すことでメールを送信します。

# 完成品がこちら
## GASのコード

```javascript
function sendEventDetailsByEmail() {
  var calendar = CalendarApp.getDefaultCalendar();
  var events = calendar.getEventsForDay(new Date()); // 今日のイベントを取得する例

  var eventDetails = "今日のイベント:\n\n";

  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    var startTime = formatTime(event.getStartTime()); // 開始時刻を日本時間表記に変換
    var endTime = formatTime(event.getEndTime()); // 終了時刻を日本時間表記に変換

    eventDetails += "タイトル: " + event.getTitle() + "\n";
    eventDetails += "開始時刻: " + startTime + "\n";
    eventDetails += "終了時刻: " + endTime + "\n\n";
  }

  var recipient = "example@example.com"; // 送信先メールアドレスを設定
  var subject = "今日の予定";
  var body = eventDetails;

  GmailApp.sendEmail(recipient, subject, body);
}

// 時間を日本時間表記（HH:mm）に変換する関数
function formatTime(date) {
  var japanTime = Utilities.formatDate(date, Session.getScriptTimeZone(), "HH:mm");
  return japanTime;
}
```

## 実行結果

無事にGoogleカレンダーに登録していた予定を取得してメールで送ることが出来ました。

![スクリーンショット 2023-11-25 21.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/fc75a708-2b8f-0faf-b6fe-c4cbe24036fa.png)

Googleカレンダーから情報とってくるのに認証周りとかややこしいかと思っていたのでこんなにも簡単に実装できて驚き！
他にも例えば予定の取得部分を以下のようにすると、「指定したカレンダーから今日から明日までの終日のイベントの中からタイトルに”重要”という文字列を含むもののみを抽出する」ということも可能です。

```javascript
  var today = new Date();
  var tomorrow = new Date();
  tomorrow.setDate(tomorrow.getDate() + 1);

  var events = calendar.getEvents(today, tomorrow); // 今日から明日までのイベントを取得

  var filteredEvents = events.filter(function(event) {
    // 重要という文字列を含む終日イベントを抽出する
    return event.getTitle().toLowerCase().includes("重要") && event.isAllDayEvent();
  });
```

# 予定の登録と削除
Googleカレンダーから予定の取得をするサンプルコードを見てみましたが、実は予定の登録や削除も簡単に行うことが出来ます。

## 予定の登録

予定の登録には`createEvent`を使います。イベントのタイトル、開始日時、終了日時、および任意の説明や場所を指定し新規予定の登録を行います。

```javascript
function createCalendarEvent() {
  var calendar = CalendarApp.getDefaultCalendar();

  var event = calendar.createEvent('新しいイベント',
    new Date('2023-12-01T10:00:00'), // 開始日時（YYYY-MM-DDTHH:mm:ss形式）
    new Date('2023-12-01T12:00:00'), // 終了日時（YYYY-MM-DDTHH:mm:ss形式）
    {
      description: 'これは新しいイベントです。',
      location: 'イベントの場所',
    }
  );

  Logger.log('イベントが作成されました。イベントID: ' + event.getId());
}
```

## 予定の削除
予定の削除には`deleteEvent`を使います。

```javascript
function deleteCalendarEvent() {
  var eventId = '削除するイベントのID'; // 削除するイベントのIDを指定
  var calendar = CalendarApp.getDefaultCalendar();
  
  var eventToDelete = calendar.getEventById(eventId);
  if (eventToDelete) {
    eventToDelete.deleteEvent();
    Logger.log('イベントが削除されました。');
  } else {
    Logger.log('指定されたIDのイベントは見つかりませんでした。');
  }
}
```
# 最後に
今日はGASからGoogleカレンダーの操作について触れてみました。[Googleカレンダークラス](https://developers.google.com/apps-script/reference/calendar/calendar?hl=ja)には様々なメソッドが用意されているのでみなさんもぜひ色々試してみてください！
明日はGoogleフォームとの連携についてみていきます。