Googleカレンダーの予定をGASで他のマイカレンダーに自動コピーする方法

## 使える場面
* マイカレンダーBを共有追加で共有したいがマイカレンダーAを先輩に共有済みで相手のカレンダーに2つ自分のカレンダーが入ってしまうのは申し訳ない。
*  本職、副業、プライベートのマイカレンダーを作成しているが、副業のカレンダーだけ共有しないで、本職とプライベートのカレンダーを統合したものを上司に共有したい。

## 方法
今回は本業、副業、プライベートのマイカレンダーを作成しており、それぞれ統合したい場合を想定して実装していきたいと思います。
1. マイカレンダーで本業、プライベート統合版を作成する。
1. 統合版に定期的に本業とプライベートの予定を自動でコピーされるようにGASでコードを書く。

## 準備
1. Googleカレンダーの右上の設定を開く![スクリーンショット 2024-08-18 22.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3856929/81735cb7-9c82-4bb4-6b94-7afe89c9c71b.png)

2. 統合したいマイカレンダーのカレンダーIDをコピー
![スクリーンショット 2024-08-18 22.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3856929/1c0e5b5c-c911-a1f4-2369-a9478238b979.png)

ここで取得したカレンダーIDはメモ帳などに貼っておきましょう。

## コード
```gas:全体コード
var calendar_shared = CalendarApp.getCalendarById('aaaaaaaaaaaaaaaaa');
var calendar_b = CalendarApp.getCalendarById('bbbbbbbbbbbbbbbbbb');
var calendar_c = CalendarApp.getCalendarById('zzzzzzzzzzzzzzzzzz');

function getEventsForDays(calendar, start_date, days) {
    if (days == 0) {
      var events = calendar.getEventsForDay(start_date);
      return events;
    } else {
      var end_time = new Date(start_date.getTime() + (days * 24 * 60 * 60 * 1000));
      var events = calendar.getEvents(start_date, end_time);
      return events;
    }
  }
  

function deleteEventsForDay(calendar, start_date, days) {
  var events = getEventsForDays(calendar, start_date, days);
  events.forEach(function(e) {
    e.deleteEvent();
  });
}

function copyEventsForDay(from_calendar, to_calendar, start_date, days) {
  var events = getEventsForDays(from_calendar, start_date, days);
  events.forEach(function(e) {
    if (e.isAllDayEvent()) {
      var startTime = e.getStartTime();
      var endTime = new Date(e.getEndTime().getTime());
      to_calendar.createAllDayEvent(e.getTitle(), startTime, endTime, {
        description: e.getDescription(),
        location: e.getLocation()
      });
    } else {
      to_calendar.createEvent(e.getTitle(), e.getStartTime(), e.getEndTime(), {
        description: e.getDescription(),
        location: e.getLocation()
      });
    }
  });
}


function syncEventsForDay(start_date, days) {
  deleteEventsForDay(calendar_shared, start_date, days);
  copyEventsForDay(calendar_b, calendar_shared, start_date, days);
  copyEventsForDay(calendar_c, calendar_shared, start_date, days);
}

function syncEventsForToday() {
  var today = new Date();
  syncEventsForDay(today, 0);
}

function syncEventsForTommorow() {
  var today = new Date();
  var tomorrow = new Date(today.getTime() + (1 * 24 * 60 * 60 * 1000));
  syncEventsForDay(tomorrow, 0);
}

function syncEventsAfter2To14Days() {
  var today = new Date();
  var two_days_after = new Date(today.getTime() + (2 * 24 * 60 * 60 * 1000));
  var fifteen_days_after = new Date(two_days_after.getTime() + (14 * 24 * 60 * 60 * 1000));
  
  syncEventsForDay(two_days_after, 14); 
}


function syncEventsAfter15To180Days() {
  var today = new Date();
  var fiften_days_after = new Date(today.getTime() + (15 * 24 * 60 * 60 * 1000));
  syncEventsForDay(fiften_days_after, 165);  
}
```

下記のコードの('')にカレンダーIDを設定
```gas:カレンダーID
var calendar_shared = CalendarApp.getCalendarById('aaaaaaaaaaaaaaaaa');
var calendar_b = CalendarApp.getCalendarById('bbbbbbbbbbbbbbbbbb');
var calendar_c = CalendarApp.getCalendarById('zzzzzzzzzzzzzzzzzz');
```

## トリガーの設定
トリガーを選択
![スクリーンショット 2024-08-18 23.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3856929/ba37ffbf-8b3a-a49c-5a5b-254a1052b82f.png)

トリガーを作成
![スクリーンショット 2024-08-18 23.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3856929/bb6bc2a3-6b8f-c5c1-f5cd-9f7fec65d741.png)

下記の4つの関数のトリガーをそれぞれ作成します。
関数を選択して「時間の間隔を選択(時間）」をそれぞれ決めていきます。

```
syncEventsForToday→1時間おき
syncEventsForTommorow→6時間おき
syncEventsAfter2To14Days→12時間おき
syncEventsAfter15To180Days() →1日おき
```
上記の設定でトリガーを4つ作成できればOKです。