Googleカレンダーのログを1時間おきに取得するGoogle Apps Script

Googleカレンダーのログを1時間おきに取得するGoogle Apps Script

2024年1月23日

Googleカレンダーは内容の変更履歴が取れず、グループで予定を変更できるようにしておくと困る時があるので当日から3日間の予定を1時間おきにスプレッドシートに吐き出すようにしました。

取得するシートで下記のスクリプトを記入して、あとはトリガーを1時間おきに設定すればカレンダーの状態を取得できます。
難点としては頻繁に更新があると細かいログが取れない点。
また、1分おきなど短い時間にトリガーを設定すると、とんでもない数のログがシートに埋まっていってしまう点。

// @ts-nocheck
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('自動処理')
      .addItem('1時間毎のログを出力', 'exportHourlyData')
      .addToUi();
}

function exportHourlyData() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var baseSheetName = "カレンダーから1時間毎に出力(ID付き)";
  var currentDate = new Date();
  var sheetName = baseSheetName + Utilities.formatDate(currentDate, spreadsheet.getSpreadsheetTimeZone(), 'yyyyMMdd');

  // シートが存在しない場合は新しく作成
  var targetSheet = spreadsheet.getSheetByName(sheetName);
  if (!targetSheet) {
    targetSheet = spreadsheet.insertSheet(sheetName);
    targetSheet.appendRow(["予定ID", "カレンダー名", "タイトル", "内容", "日付", "時間", "最終更新日時", "出力日時"]);
  }

  // 3日分のデータを1時間毎に取得して新しいシートに出力
  exportHourlyCalendarData(spreadsheet, targetSheet, 3);
}

function exportHourlyCalendarData(spreadsheet, targetSheet, days) {
  var startDateTime = new Date();
  startDateTime.setHours(0, 0, 0, 0);

  var endDateTime = new Date(startDateTime);
  endDateTime.setDate(endDateTime.getDate() + days); // Add 3 days

  var calendars = CalendarApp.getAllCalendars();
  var exportDateTime = new Date();

  for (var i in calendars) {
    var calendar = calendars[i];
    var events = calendar.getEvents(startDateTime, endDateTime);

    for (var j in events) {
      var event = events[j];
      var row = [
        event.getId(),
        calendar.getName(),
        event.getTitle(),
        event.getDescription(),
        Utilities.formatDate(event.getStartTime(), calendar.getTimeZone(), 'yyyy/MM/dd'),
        Utilities.formatDate(event.getStartTime(), calendar.getTimeZone(), 'HH:mm') + ' - ' + Utilities.formatDate(event.getEndTime(), calendar.getTimeZone(), 'HH:mm'),
        Utilities.formatDate(event.getLastUpdated(), calendar.getTimeZone(), 'yyyy/MM/dd HH:mm:ss'),
        Utilities.formatDate(exportDateTime, spreadsheet.getSpreadsheetTimeZone(), 'yyyy/MM/dd HH:mm:ss')
      ];
      targetSheet.appendRow(row);
    }
  }
}