「仕事とプライベートでGoogleカレンダーを分けてるけど、全体の予定を一覧でみたい…」 「特定のプロジェクトの会議時間だけを洗い出して集計したい…」 「過去の予定をスプレッドシートにバックアップしておきたい…」
そんなお悩み、ありませんか?
今回は、Google Apps Script (GAS) を使って、複数のGoogleカレンダーから指定した期間の予定を自動でスプレッドシートに書き出す方法をご紹介します。
単に書き出すだけでなく、キーワードでの絞り込みや、カレンダーに設定した色をシート上で再現する機能も実装します。一度設定すれば、あとはボタン一つでいつでも最新の情報を取得できる超便利ツールです。
プログラミング初心者の方でも大丈夫!今回は、話題の生成AIにGASコードを作成してもらう方法も交えながら、誰でも簡単に実装できるように解説していきます。
※私はGemini PROを利用して作成しております。
この記事はこんな方におすすめ
- 複数のカレンダーを横断して予定をシートにまとめたい方
- 特定の業務にかかった時間を集計・報告する必要がある方
- GASを使った業務効率化に興味がある方
カレンダーに予定一括登録シートの配布


シートを丸ごと配布
シートをコピーすれば、面倒なスプレットシートとGoogle Apps Script(GAS)の連携は不要で利用することができます。
GASコードのみ利用する
// スプレッドシートを開いた時にカスタムメニューを追加する
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('カレンダーからDL')
.addItem('カレンダーの予定を取得', 'exportCalendarEvents')
.addToUi();
}
// メインの処理を実行する関数
function exportCalendarEvents() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const settingsSheet = ss.getSheetByName('カレンダーDL設定');
const eventSheet = ss.getSheetByName('カレンダーからDL');
// --- 設定シートから情報を取得 ---
// A2セルからA列の最終行までカレンダーIDを取得
const calendarIds = settingsSheet.getRange('A2:A' + settingsSheet.getLastRow()).getValues()
.flat().filter(id => id !== '');
// D列から取得期間とキーワードを取得 (場所を固定)
const startDate = new Date(settingsSheet.getRange('D2').getValue());
const endDate = new Date(settingsSheet.getRange('D3').getValue());
// 終了日はその日の終わりまでを含むように調整
endDate.setHours(23, 59, 59);
const keyword = settingsSheet.getRange('D4').getValue();
// --- 入力チェック ---
if (calendarIds.length === 0) {
SpreadsheetApp.getUi().alert('カレンダーIDが設定されていません。設定シートのA2セル以降に入力してください。');
return;
}
if (!startDate.getTime() || !endDate.getTime()) {
SpreadsheetApp.getUi().alert('取得期間が正しく設定されていません。設定シートのD2, D3セルを確認してください。');
return;
}
// --- 実行処理 ---
try {
// 既存のデータをクリアしてヘッダーを準備
eventSheet.clear();
const headers = ['日付', '開始時刻', '終了時刻', '予定のタイトル', 'カレンダー名', '説明', '場所'];
eventSheet.getRange(1, 1, 1, headers.length).setValues([headers]).setFontWeight('bold');
let allEvents = [];
// 各カレンダーIDに対して処理を実行
calendarIds.forEach(calendarId => {
const calendar = CalendarApp.getCalendarById(calendarId);
if (!calendar) {
console.warn(`カレンダーが見つかりません: ${calendarId}`);
return; // 次のカレンダーへ
}
const calendarName = calendar.getName();
const events = calendar.getEvents(startDate, endDate);
events.forEach(event => {
// キーワードで絞り込み(キーワードが空の場合は全件取得)
if (keyword === '' || event.getTitle().includes(keyword)) {
allEvents.push({
event: event,
calendarName: calendarName,
color: event.getColor() || calendar.getColor() // 予定固有の色がなければカレンダーの色
});
}
});
});
// イベントを開始時刻で並び替え
allEvents.sort((a, b) => a.event.getStartTime() - b.event.getStartTime());
// --- シートに書き込み ---
if (allEvents.length === 0) {
eventSheet.getRange(2, 1).setValue('指定された期間に該当する予定はありませんでした。');
return;
}
const outputData = [];
const backgroundColors = [];
allEvents.forEach(item => {
const event = item.event;
const startTime = event.isAllDayEvent() ? '終日' : Utilities.formatDate(event.getStartTime(), 'JST', 'HH:mm');
const endTime = event.isAllDayEvent() ? '' : Utilities.formatDate(event.getEndTime(), 'JST', 'HH:mm');
const eventDate = event.isAllDayEvent() ? event.getAllDayStartDate() : event.getStartTime();
outputData.push([
Utilities.formatDate(eventDate, 'JST', 'yyyy/MM/dd'),
startTime,
endTime,
event.getTitle(),
item.calendarName,
event.getDescription(),
event.getLocation()
]);
// 色情報を保持
backgroundColors.push([item.color, null, null, null, null, null, null]);
});
// データをシートに一括書き込み
const dataRange = eventSheet.getRange(2, 1, outputData.length, outputData[0].length);
dataRange.setValues(outputData);
// 背景色を設定(先頭列のみ)
const colorRange = eventSheet.getRange(2, 1, backgroundColors.length, 1);
colorRange.setBackgrounds(backgroundColors.map(row => [row[0]]));
// 列幅を自動調整
// 1. 特定の列の幅をピクセル単位で指定する
eventSheet.setColumnWidth(1, 100); // A列: 日付
eventSheet.setColumnWidth(2, 80); // B列: 開始時刻
eventSheet.setColumnWidth(3, 80); // C列: 終了時刻
eventSheet.setColumnWidth(4, 300); // D列: 予定のタイトル
eventSheet.setColumnWidth(5, 180); // E列: カレンダー名
eventSheet.setColumnWidth(6, 400); // F列: 説明
eventSheet.setColumnWidth(7, 200); // G列: 場所
// 2. 長い文章が入りうる列のテキストを折り返す設定
// getRange(開始行, 開始列, 行数, 列数)
const wrapRange = eventSheet.getRange(2, 4, outputData.length, 4); // D列(タイトル)からG列(場所)まで
wrapRange.setWrap(true);
// 3. すべての行の高さを自動調整して、折り返したテキストが隠れないようにする
// データが始まる2行目から最終行までを対象
if (outputData.length > 0) {
eventSheet.autoResizeRows(2, outputData.length);
}
// 4. シート全体の垂直方向の配置を中央に揃える
const entireRange = eventSheet.getRange(1, 1, eventSheet.getLastRow(), headers.length);
entireRange.setVerticalAlignment('middle');
SpreadsheetApp.getUi().alert('カレンダー予定の取得が完了しました。');
} catch (e) {
console.error(e);
SpreadsheetApp.getUi().alert('処理中にエラーが発生しました。詳細はログを確認してください。' + e.message);
}
}
そもそもGAS(Google Apps Script)って何?
GASは、Googleが開発したプログラミング言語です。「Googleの様々なサービス(Gmail、スプレッドシート、ドキュメントなど)を自動化・連携が得意なプログラムのことです。GASを生成AIに書いてもらうことができる現在は、アイディアさへあればプログラミングに詳しくなくても、様々な自動化を自分で作ることができます!
もちろんプログラミング知識があればもっと複雑なこともデバックする作業も大幅に削減できるので、これを気にプログラミングの基礎も学ぶこともおすすめします。
GASのベースとなっているJavaScriptは情報も多く、プログラミング初心者でも学びやすい言語です。
関連記事
「AIがコードを書く時代、プログラミングは不要?」そう考えていませんか?実は、AIを真に使いこなすにはプログラミングの基礎知識が不可欠です。この記事では、プログラミングに何度も挫折した筆者が、JavaScriptの基礎を固め、GASで自在に業務を自動化できるようになった具体的な4ステップの学習法を全公開します。
【指定したカレンダーの予定をまとめてダウンロードスプレットシート】作成方法
プログラミング知識に自信がない人は、テンプレートとGASをセットで作ってもらうことをおすすめします。
今回は、後から追加機能を指定しなくていいように、テンプレートとGASを作成して貰う前に、自分のアイディアと生成AIのアイディアをあらかじめ出し合った上で作成してもらいます。
指定したカレンダーの予定をスプレットシートにダウンロードできるGASとシートのテンプレート作りたい。
また、このシートに追加したほうが良い機能があったら作る前にチャット欄でおしえて
#条件
ダウンロードする期間を選択できるようにして
カレンダーIDはシートに記載できるようにして

生成AIが提案してくれた追加機能から入れたい機能をピックアップ、いよいよテンプレートとGASを作成してもらいます。
これを追加して、スプレットシートのテンプレートとGASを作って
複数カレンダーの情報をまとめて取得
キーワードによる予定の絞り込み
予定ごとの色分け機能
生成AIが作ってくれたテンプレートを確認したところ1点問題がありました。

これだとカレンダーを4つ以上追加したときに【所得開始日】【所得終了日】【絞り込みキーワード】を下ずれ、GASのそれぞれの項目のセル指定をいちいち変更しなくてはいけません。いくつカレンダーを追加してもGASを修正しなくても良いようにレイアウトを修正してもらいました。
このGASだとcalendarIDが増えると取得開始日、取得終了日、絞り込みキーワードのセルの場所が変わってGASを修正しないといけなくなるから面倒くさい。いい方法ある?

お!コレならA列にいくつカレンダーID追加したとしても、各項目のセルがずれないのでGASを修正しなくても良さそうです。(「おっしゃる通り」っていうなら最初からそう作ってよ!笑)


こちらのシート名を「カレンダーDL設定」に設定します。
カレンダーの予定がダウンロードされるシートをさらに新規作成、シート名を「カレンダーからDL」にします。※中身は無地でOK
2つのシートができたら次はGASを設定します。

Scriptをペーストしたら【Ctrl+S】で保存、【Ctrl+R】でプログラムを実行すると。シートの右上に【カレンダーからDL】というメニューが表示されます。

後は、カレンダーID・所得日程など必要な情報を記載して【カレンダーの予定を所得】を押すだけで、Googleカレンダーから予定をスプレットシートにダウンロードすることができます。
カレンダーIDの調べ方やApps Scriptの使い方がわからない方はこちら
初回実行時の承認
- 初めて実行する際に「承認が必要です」というダイアログが表示されます。「続行」をクリックしてください。
- 自分のGoogleアカウントを選択します。
- 「このアプリは Google で確認されていません」という警告画面が表示される場合がありますが、これは自作のスクリプトのためです。左下の「詳細」をクリックし、「(プロジェクト名)(安全ではないページ)に移動」をクリックして次に進んでください。
- 「メールの送信」などを許可する画面が表示されるので、「許可」をクリックします。
承認が完了すると、スクリプトが実行されます。

