GAS×Googleカレンダー連携ガイド|スプレッドシートから予定を自動追加する方法

スプレッドシートの予定をGoogleカレンダーに手作業で入力していませんか?GASなら、ボタン1つで一括追加できます!
- CalendarAppの基本とカレンダーIDの確認方法
- スプレッドシートの予定をカレンダーに一括追加するGASコード
- Googleフォーム送信時にカレンダーへ自動登録する方法
- カレンダーの予定をスプレッドシートに書き出す方法
- 日時形式エラー・権限エラーなどよくあるトラブルの対処法
GAS × Googleカレンダー連携でできること
Google Apps Script(GAS)のCalendarAppクラスを使えば、Googleカレンダーの予定をプログラムで自動操作できます。手作業で1件ずつ予定を入力する必要がなくなり、業務効率が大幅に向上します。
この記事では、実務で特にニーズの高い3つのユースケースを、コピペで使えるGASコード付きで解説します。
- ケース①:スプレッドシートの予定を一括でカレンダーに追加(最も人気)
- ケース②:Googleフォーム送信時に自動でカレンダーに予定追加
- ケース③:カレンダーの予定を毎週スプレッドシートに書き出す


GASの基本がまだわからない方は、先に「GAS入門ガイド」を読んでから本記事に進むとスムーズです。
事前準備:CalendarApp の基本と権限設定
GASからGoogleカレンダーを操作するには、CalendarAppクラスを使います。まずは基本となるカレンダーIDの確認方法と、権限承認の手順を押さえましょう。
カレンダーIDの確認方法
デフォルトカレンダー(自分のメインカレンダー)を使う場合は、IDの指定は不要です。CalendarApp.getDefaultCalendar()で取得できます。
特定のカレンダー(チーム共有カレンダーなど)を使う場合は、以下の手順でカレンダーIDを確認します。
- Googleカレンダーを開く
- 左サイドバーで対象カレンダーの「⋮」→「設定と共有」をクリック
- 「カレンダーの統合」セクションにあるカレンダーIDをコピー
デフォルトカレンダーのIDは、自分のGmailアドレスと同じです。共有カレンダーのIDはxxxxxxxx@group.calendar.google.comのような形式になります。
// デフォルトカレンダーを取得
const calendar = CalendarApp.getDefaultCalendar();
// 特定のカレンダーをIDで取得
const teamCal = CalendarApp.getCalendarById('チームカレンダーのID@group.calendar.google.com');
スクリプトの権限承認手順
GASからカレンダーを操作するスクリプトを初めて実行すると、Googleの権限承認画面が表示されます。以下の手順で承認してください。
- スクリプトエディタで「▶ 実行」をクリック
- 「承認が必要です」ダイアログで「権限を確認」をクリック
- Googleアカウントを選択
- 「このアプリはGoogleで確認されていません」と表示されたら「詳細」→「○○(安全でないページ)に移動」をクリック
- 「許可」をクリックして完了
「安全でないページ」という警告は、自分で作成したスクリプトがGoogle公式の審査を受けていないためです。自分のコードであれば問題なく許可して大丈夫です。一度承認すれば、以降は同じスクリプトでの承認は不要になります。
ケース①:スプレッドシートの予定を一括でカレンダーに追加する
最も多いユースケースが「スプレッドシートに入力した予定を、まとめてGoogleカレンダーに登録する」というパターンです。イベント管理やプロジェクトスケジュールの一括登録に活用できます。
スプレッドシートの準備
まず、以下のような列構成でスプレッドシートを作成します。
| A列 | B列 | C列 | D列 | E列 |
|---|---|---|---|---|
| タイトル | 開始日時 | 終了日時 | 場所 | 説明 |
| 定例ミーティング | 2026/04/10 10:00 | 2026/04/10 11:00 | 会議室A | 週次定例 |
| クライアント打合せ | 2026/04/11 14:00 | 2026/04/11 15:30 | Zoom | Q2計画確認 |
| 社内研修 | 2026/04/15 09:00 | 2026/04/15 17:00 | 本社3F | 新入社員研修 |
1行目はヘッダー行にしてください。スクリプトでは2行目以降のデータを読み取ります。日時はYYYY/MM/DD HH:MMの形式で入力します。
GASコード(一括追加スクリプト)
以下のコードをスクリプトエディタにコピペして実行すると、スプレッドシートの全予定がGoogleカレンダーに登録されます。
function addEventsToCalendar() {
// アクティブなスプレッドシートのデータを取得
const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getDataRange().getValues();
const calendar = CalendarApp.getDefaultCalendar();
// 2行目(インデックス1)から最終行まで処理
for (let i = 1; i < data.length; i++) {
const title = data[i][0]; // A列: タイトル
const startTime = new Date(data[i][1]); // B列: 開始日時
const endTime = new Date(data[i][2]); // C列: 終了日時
const location = data[i][3]; // D列: 場所
const description = data[i][4]; // E列: 説明
// タイトルが空の行はスキップ
if (!title) continue;
// カレンダーに予定を追加
calendar.createEvent(title, startTime, endTime, {
location: location,
description: description
});
// API制限対策:1件ごとに1秒待機
Utilities.sleep(1000);
}
// 完了メッセージをログに出力
Logger.log('カレンダーへの一括登録が完了しました(' + (data.length - 1) + '件)');
}
getDataRange().getValues():シート上のデータを2次元配列として取得しますnew Date():スプレッドシートの日時データをDate型に変換しますcreateEvent(title, start, end, options):カレンダーに予定を追加するメソッドですUtilities.sleep(1000):APIの短時間呼び出し制限を回避するためのウェイトです
重複登録を防ぐ方法
上記のスクリプトをそのまま複数回実行すると、同じ予定が重複して登録されてしまいます。これを防ぐために、F列に「登録済み」フラグを追加する改良版を使いましょう。
function addEventsWithDuplicateCheck() {
const sheet = SpreadsheetApp.getActiveSheet();
const data = sheet.getDataRange().getValues();
const calendar = CalendarApp.getDefaultCalendar();
let addedCount = 0;
for (let i = 1; i < data.length; i++) {
const title = data[i][0];
const startTime = new Date(data[i][1]);
const endTime = new Date(data[i][2]);
const location = data[i][3];
const description = data[i][4];
const status = data[i][5]; // F列: 登録ステータス
// タイトルが空、または既に登録済みの行はスキップ
if (!title || status === '登録済み') continue;
// カレンダーに予定を追加
const event = calendar.createEvent(title, startTime, endTime, {
location: location,
description: description
});
// F列に「登録済み」と記入、G列にイベントIDを記録
sheet.getRange(i + 1, 6).setValue('登録済み');
sheet.getRange(i + 1, 7).setValue(event.getId());
addedCount++;
Utilities.sleep(1000);
}
Logger.log(addedCount + '件の予定を新規追加しました');
}
この改良版では、F列に「登録済み」と記入される行はスキップされるため、何度実行しても重複しません。G列にイベントIDを記録しておくと、後から予定を変更・削除する際にも便利です。
ケース②:Googleフォーム送信時に自動でカレンダーに予定追加
会議室の予約やイベント参加申し込みなど、Googleフォームの送信をきっかけにカレンダーへ自動登録するパターンです。手動でのカレンダー入力が不要になり、申し込みから予定反映までが完全自動化されます。
フォームの作成とスプレッドシート連携
まず、Googleフォームで以下の項目を設定します。
- Googleフォームを新規作成
- 以下の質問を追加:予定タイトル(記述式)、開始日時(日付+時刻)、終了日時(日付+時刻)、場所(記述式)
- 「回答」タブ → スプレッドシートアイコン → 「新しいスプレッドシートを作成」で回答先を設定
- 連携されたスプレッドシートの「拡張機能」→「Apps Script」でスクリプトエディタを開く
GASコード(フォーム送信トリガー)
以下のコードをスクリプトエディタに貼り付け、トリガーを設定して使います。
function onFormSubmit(e) {
// フォームの回答を取得(スプレッドシート経由)
const values = e.values;
// values[0] = タイムスタンプ
// values[1] = 予定タイトル
// values[2] = 開始日時
// values[3] = 終了日時
// values[4] = 場所
const title = values[1];
const startTime = new Date(values[2]);
const endTime = new Date(values[3]);
const location = values[4] || '';
// デフォルトカレンダーに予定を追加
const calendar = CalendarApp.getDefaultCalendar();
calendar.createEvent(title, startTime, endTime, {
location: location,
description: 'Googleフォームから自動登録'
});
Logger.log('フォーム送信による予定追加完了: ' + title);
}
コードを保存したら、トリガーの設定を行います。
- スクリプトエディタ左の「⏰(トリガー)」アイコンをクリック
- 右下の「+ トリガーを追加」をクリック
- 以下のように設定:
| 設定項目 | 選択値 |
|---|---|
| 実行する関数 | onFormSubmit |
| 実行するデプロイ | Head |
| イベントのソース | スプレッドシートから |
| イベントの種類 | フォーム送信時 |
| エラーの通知設定 | 毎日通知を受け取る |
設定後に「保存」をクリックし、権限の承認を行えば完了です。以降、フォームが送信されるたびにカレンダーへ予定が自動追加されます。
トリガーのイベントソースは「スプレッドシートから」と「フォームから」の2種類があり、引数eの構造が異なります。上記のコードは「スプレッドシートから」を前提にしています。「フォームから」を選択した場合はe.response.getItemResponses()で値を取得する必要があります。
ケース③:カレンダーの予定を毎週スプレッドシートに書き出す
逆方向のユースケースとして、Googleカレンダーの予定をスプレッドシートに書き出す方法です。週報作成やプロジェクトの工数集計に役立ちます。
GASコード(予定取得&書き出しスクリプト)
以下のコードで、今週月曜日から日曜日までのカレンダー予定をスプレッドシートに書き出します。
function exportCalendarToSheet() {
const calendar = CalendarApp.getDefaultCalendar();
// 今週の月曜日と日曜日を計算
const today = new Date();
const dayOfWeek = today.getDay(); // 0=日, 1=月, ..., 6=土
const monday = new Date(today);
monday.setDate(today.getDate() - (dayOfWeek === 0 ? 6 : dayOfWeek - 1));
monday.setHours(0, 0, 0, 0);
const sunday = new Date(monday);
sunday.setDate(monday.getDate() + 6);
sunday.setHours(23, 59, 59, 999);
// 期間内のイベントを取得
const events = calendar.getEvents(monday, sunday);
// 書き出し先のシートを準備
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName('週間予定');
if (!sheet) {
sheet = ss.insertSheet('週間予定');
}
sheet.clearContents();
// ヘッダー行を書き込み
sheet.getRange(1, 1, 1, 5).setValues([
['タイトル', '開始日時', '終了日時', '場所', '説明']
]);
// イベントデータを書き込み
if (events.length > 0) {
const eventData = events.map(event => [
event.getTitle(),
event.getStartTime(),
event.getEndTime(),
event.getLocation(),
event.getDescription()
]);
sheet.getRange(2, 1, eventData.length, 5).setValues(eventData);
}
Logger.log('週間予定の書き出し完了(' + events.length + '件)');
}
実行すると、「週間予定」シートにカレンダーの予定が一覧で書き出されます。シートが存在しない場合は自動作成されます。
時間主導型トリガーで毎週自動実行する
このスクリプトを毎週月曜日の朝に自動実行させるには、以下のトリガー設定用スクリプトを使います。
function createWeeklyTrigger() {
// 既存の同名トリガーを削除(重複防止)
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(trigger => {
if (trigger.getHandlerFunction() === 'exportCalendarToSheet') {
ScriptApp.deleteTrigger(trigger);
}
});
// 毎週月曜日 午前8〜9時に実行するトリガーを作成
ScriptApp.newTrigger('exportCalendarToSheet')
.timeBased()
.onWeekDay(ScriptApp.WeekDay.MONDAY)
.atHour(8)
.create();
Logger.log('毎週月曜のトリガーを設定しました');
}
createWeeklyTrigger()を一度だけ実行すれば、以降は毎週月曜日に自動でカレンダーの予定がスプレッドシートに書き出されます。
よくあるエラーと対処法(日時形式・権限エラー等)
GASでカレンダー連携をする際に、頻出するエラーとその対処法をまとめました。
日時形式エラー(Date型の扱い)
症状:Exception: The parameters (String, String, String) don't match the method signature
原因:createEvent()の第2引数・第3引数に文字列を渡している。Date型が必要です。
対処法:new Date()で明示的にDate型に変換してください。
// NG: 文字列のまま渡している
calendar.createEvent('会議', '2026/04/10 10:00', '2026/04/10 11:00');
// OK: Date型に変換して渡す
calendar.createEvent('会議', new Date('2026/04/10 10:00'), new Date('2026/04/10 11:00'));
また、スプレッドシートのセル書式が「テキスト」になっていると、日付データが文字列として扱われます。セルの書式を「自動」または「日時」に変更してください。
権限エラー(スコープ不足)
症状:Exception: スクリプトにはその操作を行う権限がありません
原因:カレンダーへのアクセス権限が承認されていないか、appsscript.jsonにスコープが不足しています。
対処法:
- スクリプトエディタで関数を手動実行し、権限の承認画面で「許可」をクリック
- それでも解消しない場合は、「プロジェクトの設定」→「appsscript.jsonをエディタで表示」をONにし、
oauthScopesに"https://www.googleapis.com/auth/calendar"を追加
API呼び出し制限エラー
症状:Service invoked too many times in a short time: Calendar
原因:短時間にカレンダーAPIを連続呼び出ししすぎたため、Googleのレート制限に引っかかっています。
対処法:
Utilities.sleep(1000)を各API呼び出しの間に入れる(ケース①のコードでは対策済み)- 100件を超える大量登録は、スクリプトを分割して実行する
- 1日あたりのカレンダー作成数にも制限があるため、500件以上は日をまたいで実行する
- スクリプト実行時間:無料アカウント 6分/回、Workspace 30分/回
- トリガー実行時間:合計90分/日
- カレンダーイベント作成:短時間の連続呼び出しに制限あり(Utilities.sleepで回避)
よくある質問(FAQ)
Q. 他の人のカレンダーにも予定を追加できますか?
はい、共有カレンダーであればCalendarApp.getCalendarById('カレンダーID')でアクセスして予定を追加できます。ただし、対象カレンダーの「変更及び共有の管理権限」が付与されている必要があります。権限がない場合はnullが返されるため、カレンダーのオーナーに共有設定を依頼してください。
Q. 終日イベントを登録するにはどうすればよいですか?
createAllDayEvent(title, date)メソッドを使います。第2引数にDateオブジェクトで日付のみを指定すれば、時間指定なしの終日イベントが登録されます。複数日にまたがる終日イベントはcreateAllDayEvent(title, startDate, endDate)で作成できます。
// 終日イベント(1日)
calendar.createAllDayEvent('休日', new Date('2026/05/03'));
// 終日イベント(複数日)
calendar.createAllDayEvent('GW休暇', new Date('2026/05/03'), new Date('2026/05/06'));
Q. 一度に何件まで予定を追加できますか?
明確な上限件数はありませんが、GASの実行時間制限(無料6分)とカレンダーAPIの短時間呼び出し制限があります。Utilities.sleep(1000)でウェイトを入れた場合、6分間で約300件が目安です。100件以上の大量登録ではバッチ分割を検討してください。
Q. 登録した予定を後から変更・削除するには?
getEventById()でイベントオブジェクトを取得し、setTitle()で件名変更、setTime()で日時変更、deleteEvent()で削除ができます。ケース①の改良版でG列に記録したイベントIDを使えば、特定の予定を確実に操作できます。
// イベントIDで予定を取得して変更・削除
const event = calendar.getEventById('イベントID');
event.setTitle('新しいタイトル'); // 件名変更
event.setTime(newStart, newEnd); // 日時変更
event.setLocation('新しい場所'); // 場所変更
event.deleteEvent(); // 削除
Q. GASの無料枠の制限はありますか?
無料Googleアカウントでは、スクリプトの実行時間が6分/回、トリガー実行時間が合計90分/日です。Google Workspaceアカウント(有料)では実行時間が30分/回に拡張されます。個人利用であれば無料枠で十分対応可能です。
まとめ:さらに応用するための次のステップ
この記事では、GASとGoogleカレンダーを連携させる3つのユースケースを解説しました。
- ケース①:スプレッドシート → カレンダーへの一括追加(重複チェック付き)
- ケース②:Googleフォーム送信 → カレンダーへの自動登録
- ケース③:カレンダー → スプレッドシートへの週次書き出し
コードはすべてコピペで動作します。まずはケース①から試して、GASでのカレンダー操作に慣れてみてください。
- GASの基本を学ぶ → GAS入門ガイド|環境構築から自動化まで
- スプレッドシートのデータ操作を強化 → QUERY関数の使い方
