概要
グーグルカレンダーにある情報をスプレッドシートにテキストデータで蓄積するGASを書いてみた。
後述する「設定」シートの「取得開始の対象期間」と「取得終了の対象期間」にtoday関数などを用いれば、一応毎日蓄積もできる。
社内での展開などをできるように、可能な限りGASの設定を変えなくても実行できるよう意識したが、「カレンダーマスター」と「設定」のシート名を変えたい場合はGASでの編集が必要になる。
使用方法
以下のようなスプレッドシートを用意して、メニューバー上の 「カレンダー取得」→「実行」 をクリックすると、「設定」シートの内容に基づいてカレンダー情報が取得される。
最終行に蓄積されていくので、蓄積されたデータを削除したい場合は 「カレンダー取得」→「クリア」 をクリック。もしくは、手動操作で行ごと削除する。
コードは「設定」シートの以下の条件に基づいて実行される。
- 「取得開始の対象期間」から「取得終了の対象期間」の間にあるスケジュールが取得される
- 取得対象のスケジュール件名がある場合は(特定の打ち合わせのみ など)記載する。すべて取得したい場合は空白にしておく
他、注意事項は以下の通り。
- 「カレンダーマスター」シート、「設定」シートの列は消さない(装飾や文字内容の変更は可。削除はダメ)
- 「設定」シートは二行目の内容のみが有効。三行目以降に追記しても有効にはならない
コード内容
以下のコードをスプレッドシートのGASエディタにコピーすればOK。
settingsSheet と calendarSheet を取得する部分で、シート名を直接指定すれば、「カレンダーマスター」という微妙な命名のシート名から脱却できる。
コード内容
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();
}
今後の発展(考えているだけ)
- 「設定」シートの拡充(複数条件の反映など)
- 実行時に「全消しするか、追加していくか」を選べるようにする
- 部分一致キーワードの複数選択
本コードが誰かの役に立てば幸いです。