大量の予定をGASで一括カレンダー登録する方法

こんにちは、GASおじさんです。今回は「大量の予定をGoogle Apps Script(以下GAS)で一括カレンダー登録する方法」について解説します。中小企業の経営者やフリーランスの皆さん、手間のかかるカレンダー管理を効率化してコストも抑えたいですよね?
おじさんが教えるやり方は、既存のカレンダー予定を消さず、安全に大量登録する方法。しかもGoogleアカウントの利用枠内で使えるので、追加のSaaS料金不要。もちろんApps Scriptの実行上限はあるので、その点はご注意を。
初期設定と必要な権限
まずはGASでカレンダーにアクセスできるように権限を設定しましょう。今回のスクリプトはカレンダーの読み書き権限が必要です。
- Googleドライブに新規スプレッドシートを作成
- メニュー「拡張機能」→「Apps Script」を開く
- コードを貼り付けて保存
- 初回実行時に「カレンダーへのアクセス許可」を求められるので承認する
また、個人情報(予定のタイトルや日時など)を扱うため、取り扱いには十分注意してください。スクリプトはGoogleアカウントの利用枠内で動作し、追加の専用SaaS料金は発生しません。
バッチ登録でも既存データはそのまま残す設計
いきなりカレンダーの既存予定を消してしまうのは危険です。そこで今回は、予定データを新規日時付きのスプレッドシートにバックアップしつつ、新しい予定は新規作成のみを行います。
既存データの削除系APIは使わず、また既存シートを更新しません。これにより万一のトラブル時も復元が可能です。
コード例:CSV風データをスプレッドシートから読み込みカレンダーに一括登録
以下はスプレッドシートのA列に「タイトル」、B列に「開始日時」、C列に「終了日時」が入っていると仮定した例です。日時はISO形式(例:2026-10-20T09:00:00)で入力してください。
function batchImportEvents() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 新規バックアップ用シートを日付付きで作成(例: Backup_20261016_1030)
const backupSheetName = 'Backup_' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmm');
const backupSheet = ss.insertSheet(backupSheetName);
// 元データシート(予定を入力しているシート名を指定)
const dataSheet = ss.getSheetByName('予定データ');
if (!dataSheet) {
throw new Error('「予定データ」シートが見つかりません。');
}
// データ範囲を取得(ヘッダー行除く)
const lastRow = dataSheet.getLastRow();
if (lastRow < 2) {
Logger.log('登録する予定データがありません。');
return;
}
const dataRange = dataSheet.getRange(2, 1, lastRow -1, 3);
const data = dataRange.getValues();
// バックアップに元データをコピー
backupSheet.getRange(1, 1, 1, 3).setValues([['タイトル', '開始日時', '終了日時']]);
backupSheet.getRange(2, 1, data.length, 3).setValues(data);
// カレンダーID(自分のカレンダーIDに変更してください)
const calendarId = CalendarApp.getDefaultCalendar().getId();
const calendar = CalendarApp.getCalendarById(calendarId);
// 入力検証とバッチ処理用にイベントオブジェクトを作成
const eventsToCreate = [];
data.forEach((row, index) => {
const [title, startStr, endStr] = row;
if (!title || !startStr || !endStr) {
Logger.log(`行${index + 2}に空欄があります。スキップします。`);
return;
}
const startDate = new Date(startStr);
const endDate = new Date(endStr);
// 開始日時・終了日時の妥当性チェック
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
Logger.log(`行${index + 2}の日付形式が不正です。スキップします。`);
return;
}
if (endDate <= startDate) {
Logger.log(`行${index + 2}の終了日時が開始日時より前です。スキップします。`);
return;
}
eventsToCreate.push({title, startDate, endDate});
});
// バッチ登録(1イベントずつ登録はAPI制限に注意)
eventsToCreate.forEach(e => {
calendar.createEvent(e.title, e.startDate, e.endDate);
});
Logger.log(`合計${eventsToCreate.length}件の予定をカレンダーに登録しました。`);
}
導入後のコスト削減イメージ
この方法を導入すれば、手作業での予定登録にかかる時間を大幅に削減できます。仮に1件の予定登録に1分かかっていたとすると、
- 100件の予定登録 = 100分(約1.6時間)
- おじさんの時給を仮に3,000円とすると、1.6時間×3,000円=4,800円のコスト削減
しかもこのスクリプトはGoogleアカウントの利用枠内で動くため、追加の専用SaaS料金は不要。Apps Scriptのquotaや実行時間上限はありますが、通常の業務で使う範囲なら十分対応可能です。
復元手順とトラブル対策
- 予定データを誤って消してしまった場合も、バックアップシートに元データが残っています。ここから再度スクリプトを実行すれば復元可能です。
- 万が一トリガー設定で問題が起きた場合は、Apps Scriptの管理画面からinstallable triggerを削除・再作成してください。
- 個人情報が含まれるため、スプレッドシートの共有設定は慎重に行いましょう。
まとめ
- 既存の予定は削除せず、新規登録のみを行う安全設計
- バックアップシートで元データ管理&復元可能
- 入力検証で不正データをスキップし安定動作
- Googleアカウントの利用枠内で無料利用(専用SaaS料金なし)
- 実行上限・quotaには注意を
手作業の面倒な予定登録はGASおじさんにお任せあれ。ぜひ今回のスクリプトを試してみてくださいね。