スプレッドシートからGoogleカレンダーに予定を自動で登録するには、予定の一覧を表にしておき、GAS(Google Apps Script)で1行ずつ CalendarApp の createEvent を呼びます。
同じ予定が何度も登録されないように、登録した予定のIDを表に書き戻し、IDがある行は飛ばすのがポイントです。
この記事は、イベントや訪問の予定をスプレッドシートで管理していて、カレンダーへの入力を手で繰り返したくない方に向けたものです。
掲載したコードは、2026年10月15日にNode.jsの模擬環境で、時刻ありと終日の分け方、登録済みの行を飛ばす処理、時刻の誤りの検出を確かめました。
実際のGoogleカレンダーへの登録は試していないため、使う前にテスト用の行で確かめてください。
表を用意する
「予定」という名前のシートに、次の列を作ります。
| 列 | 入れるもの | 例 |
|---|---|---|
| A | タイトル | 定例会議 |
| B | 日付 | 2026/10/20 |
| C | 開始時刻(終日なら空欄) | 10:00 |
| D | 終了時刻(終日なら空欄) | 11:30 |
| E | 場所 | 会議室A |
| F | 説明 | 週次の進捗確認 |
| G | 登録済みID(空欄のまま始める) | スクリプトが書き込む |
| H | メモ(空欄のまま始める) | エラーがあれば書き込む |
日付と時刻は、文字ではなく日付・時刻としてセルに入れます。
文字として入っていると、スクリプトはその行を飛ばします。
コード
スプレッドシートの「拡張機能」から「Apps Script」を開き、次のコードを貼り付けて保存します。
// スプレッドシートに紐づいたスクリプトに貼り付けて使う
// 列:A タイトル/B 日付/C 開始時刻/D 終了時刻/E 場所/F 説明/G 登録済みID/H メモ(G・Hは空欄のまま始める)
const SHEET_NAME = '予定';
const CALENDAR_ID = ''; // 空欄ならデフォルトのカレンダー。別のカレンダーはIDを入れる
function registerEvents() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const calendar = CALENDAR_ID ? CalendarApp.getCalendarById(CALENDAR_ID) : CalendarApp.getDefaultCalendar();
const values = sheet.getDataRange().getValues();
for (let i = 1; i < values.length; i++) { // 1行目は見出し
const [title, date, start, end, location, description, registeredId] = values[i];
if (!title || !(date instanceof Date) || registeredId) {
continue; // タイトルか日付がない行と、登録済みの行は飛ばす
}
let event;
if (start instanceof Date && end instanceof Date) {
const startTime = combine(date, start);
const endTime = combine(date, end);
if (endTime <= startTime) {
sheet.getRange(i + 1, 8).setValue('終了時刻が開始時刻より前です');
continue;
}
event = calendar.createEvent(title, startTime, endTime, { location: location, description: description });
} else {
event = calendar.createAllDayEvent(title, date, { location: location, description: description });
}
sheet.getRange(i + 1, 7).setValue(event.getId()); // 二重登録を防ぐためにIDを残す
sheet.getRange(i + 1, 8).setValue('');
}
}
function combine(date, time) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes());
}エディタで関数「registerEvents」を選んで実行し、カレンダーへのアクセスを許可すると、予定が登録されます。
コードの動き
| 処理 | していること |
|---|---|
| 登録済みの確認 | G列にIDがある行と、タイトルか日付がない行は飛ばす |
| 時刻ありの予定 | 日付と時刻を組み合わせて createEvent で登録する |
| 終日の予定 | 開始時刻と終了時刻が空欄なら createAllDayEvent で登録する |
| 時刻の誤り | 終了時刻が開始時刻より前なら登録せず、H列にメモを書く |
| IDの書き戻し | 登録した予定のIDをG列に書き、次からは飛ばす |
Apps Scriptのリファレンスでは、createEvent はタイトル、開始と終了の日時、場所や説明などのオプションを受け取り、作った予定を返すと説明されています(Apps Script:Class Calendar)。
CALENDAR_ID を空欄にすると、自分のデフォルトのカレンダーに登録されます。
共有のカレンダーなど別のカレンダーに登録する場合は、そのカレンダーの設定画面に表示されるカレンダーIDを入れます。
タイムゾーンに注意する
リファレンスでは、createEvent でタイムゾーンを指定しない場合、時刻はスクリプトのタイムゾーンで解釈され、カレンダーのタイムゾーンと違うことがあると説明されています。
Apps Scriptのプロジェクトの設定で、タイムゾーンが日本(東京)など、実際に使う地域になっているかを確かめてください。
予定の時刻が数時間ずれて登録される場合は、まずここを確かめます。
招待メールと上限
参加者を招待したい場合は、オプションに guests(カンマ区切りのメールアドレス)を加えます。
リファレンスでは、招待メールを送るかどうかを決める sendInvites の初期値は false と説明されています。
Apps Scriptの上限の一覧では、1日に作れるカレンダーの予定は、無料のアカウントで5,000件、Google Workspaceのアカウントで10,000件、1回の実行時間は6分までとなっています(Apps Script:Quotas for Google Services)。
一度に大量の行を登録する場合は、6分を超えないように何回かに分けて実行します。
実行時間の制限への対処は、getValuesとsetValuesで一括処理する方法も参考になります。
自動で実行する
新しい行を追加したら自動で登録したい場合は、時間主導型のトリガーで、1時間ごとなどに registerEvents を実行させます。
G列のIDで登録済みの行を飛ばすため、何度実行しても同じ予定が重複して作られません。
トリガーの設定方法は、GASのトリガーの設定方法で説明しています。
登録した後に確かめること
- カレンダーで、予定の日付と時刻が表と同じになっている
- 終日の予定が、終日として表示されている
- G列にIDが入り、もう一度実行しても予定が増えない
- H列にメモが出た行の時刻を直し、メモを消して再度実行した
表から予定を消しても、カレンダーの予定は自動では消えません。
予定を取り消す場合は、カレンダー側でも削除してください。
祝日や休日にスクリプトを動かさないようにしたい場合は、祝日・休日・指定した日はスクリプトをスキップする方法を参考にしてください。
