Googleカレンダーからスプレッドシートに転記するGASコード（備忘録）

# 概要
グーグルカレンダーにある情報をスプレッドシートにテキストデータで蓄積するGASを書いてみた。
後述する「設定」シートの「取得開始の対象期間」と「取得終了の対象期間」にtoday関数などを用いれば、一応毎日蓄積もできる。

社内での展開などをできるように、可能な限りGASの設定を変えなくても実行できるよう意識したが、「カレンダーマスター」と「設定」のシート名を変えたい場合はGASでの編集が必要になる。

# 使用方法
以下のようなスプレッドシートを用意して、メニューバー上の **「カレンダー取得」→「実行」** をクリックすると、「設定」シートの内容に基づいてカレンダー情報が取得される。
最終行に蓄積されていくので、蓄積されたデータを削除したい場合は **「カレンダー取得」→「クリア」** をクリック。もしくは、手動操作で行ごと削除する。

https://docs.google.com/spreadsheets/d/1MeVSDwsYRrw-mIqT1daLbJ39R2HpTupv2naC8pbINM0/edit#gid=0

コードは「設定」シートの以下の条件に基づいて実行される。
1. 「取得開始の対象期間」から「取得終了の対象期間」の間にあるスケジュールが取得される
2. 取得対象のスケジュール件名がある場合は（特定の打ち合わせのみ　など）記載する。すべて取得したい場合は空白にしておく

他、注意事項は以下の通り。
1. 「カレンダーマスター」シート、「設定」シートの列は消さない（装飾や文字内容の変更は可。削除はダメ）
2. 「設定」シートは二行目の内容のみが有効。三行目以降に追記しても有効にはならない

# コード内容
以下のコードをスプレッドシートのGASエディタにコピーすればOK。
**settingsSheet** と **calendarSheet** を取得する部分で、シート名を直接指定すれば、「カレンダーマスター」という微妙な命名のシート名から脱却できる。

```JavaScript:コード内容
function exportCalendarToSheet() {
  // シート情報の取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var settingsSheet = spreadsheet.getSheetByName("設定");
  var calendarSheet = spreadsheet.getSheetByName("カレンダーマスター");

  // 「設定」シートからカレンダーの取得条件を取得
  var startDate = new Date(settingsSheet.getRange("A2").getValue());
  var endDate = new Date(settingsSheet.getRange("B2").getValue());
  var keyword = settingsSheet.getRange("C2").getValue();
  var calendarId = settingsSheet.getRange("D2").getValue(); 

  // カレンダーの取得
  var events = CalendarApp.getCalendarById(calendarId).getEvents(startDate, endDate);

  // カレンダー情報を二次元配列で取得（appenmdRowなどで一行ずつ出力すると実行速度が遅くなるため）
  var data = [];
  for (var i = 0; i < events.length; i++) {
    // イベント全体の情報
    var event = events[i];

    // 件名
    var title = event.getTitle();
    // 概要
    var description = event.getDescription();
    // 場所
    var location = event.getLocation();
    // 開始時刻
    var start = event.getStartTime();
    // 終了時刻
    var end = event.getEndTime();
    // 開始時間
    var startDateTime = Utilities.formatDate(start, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
    // 終了時間
    var endDateTime = Utilities.formatDate(end, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
    //　参加者（複数名の場合はカンマでつなぐ）
    var attendees = event.getGuestList().map(function(attendee) {
      return attendee.getEmail();
    }).join(", ");
    
    // キーワードマッチ
    if (!keyword || (keyword && (title.toLowerCase().includes(keyword.toLowerCase()) || description.toLowerCase().includes(keyword.toLowerCase())))) {
      data.push([start, end, startDateTime, endDateTime, title, description, location, attendees]);
    }
  }

  // 「カレンダーマスター」に出力
  calendarSheet.getRange(calendarSheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data);
}

function clearCalendarSheet() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var calendarSheet = spreadsheet.getSheetByName("カレンダーマスター");
  
  // 1行目から下を削除
  calendarSheet.getRange(2, 1, calendarSheet.getLastRow() - 1, calendarSheet.getLastColumn()).clear();
}

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('カレンダー取得')
      .addItem('実行', 'exportCalendarToSheet')
      .addItem('クリア', 'clearCalendarSheet') 
      .addToUi();
}
```

# 今後の発展（考えているだけ）
1. 「設定」シートの拡充（複数条件の反映など）
2. 実行時に「全消しするか、追加していくか」を選べるようにする
3. 部分一致キーワードの複数選択

本コードが誰かの役に立てば幸いです。