0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-10-15

概要

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

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

使用方法

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

コードは「設定」シートの以下の条件に基づいて実行される。

  1. 「取得開始の対象期間」から「取得終了の対象期間」の間にあるスケジュールが取得される
  2. 取得対象のスケジュール件名がある場合は(特定の打ち合わせのみ など)記載する。すべて取得したい場合は空白にしておく

他、注意事項は以下の通り。

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

コード内容

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

コード内容
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. 部分一致キーワードの複数選択

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?