来客訪問や納品スケジュールをスプレッドシートで管理していても、Googleカレンダーへの登録はひとつずつ手作業で行っている会社は珍しくありません。
件数が増えるほど登録漏れや日時の入力ミスが起きやすくなり、担当者が変わるたびに同じ手間を引き継ぐことになります。
この記事ではGoogle Apps Scriptでスプレッドシートの予定表をGoogleカレンダーへ一括登録する仕組みを、二重登録を防ぐ列設計まで整理しています。
完成イメージと仕組み
完成すると、指定したシートに入力した予定が開始日時と終了日時をもとにGoogleカレンダーへまとめて登録される状態になります。
仕組みとしては、スクリプトがシートの行をひとつずつ確認し、まだ登録していない行だけをカレンダーへ書き込みます。
書き込みが終わった行には登録済みという印を付けるため、同じスクリプトを何度実行しても同じ予定が重複して登録される心配がありません。
手順
シートの準備からテスト実行まで、4つのステップで完成します。
Step1. 登録元のシートを準備する
転記先ではなく、登録元になるシートを新規に用意します。
1行目に見出しを入れ、2行目以降に予定を入力していきます。
列の並びは次のとおりです。
| 列 | 入力内容 | 記入例 |
|---|---|---|
| A列 | 予定のタイトル | 定例訪問_田中商事 |
| B列 | 開始日時 | 2026/07/15 10:00 |
| C列 | 終了日時 | 2026/07/15 11:00 |
| D列 | 登録済みフラグ | 空欄のまま |
D列は空欄のまま残しておきます。
スクリプトが登録を終えた行に自動で書き込む列のため、あらかじめ文字を入れる必要はありません。
Step2. コードを貼り付ける(コード全文)
スプレッドシート上部のメニューから拡張機能を開き、Google Apps Scriptを選ぶとスクリプトエディタが立ち上がります。
表示されているコードを全て消し、次のコードを貼り付けます。
function registerEventsToCalendar() {
const sheetName = '登録予定'; // ★ここを変える: 予定表のシート名
const registeredMark = '登録済み';
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
if (!sheet) {
throw new Error(`シート「${sheetName}」が見つかりません`);
}
const calendar = CalendarApp.getDefaultCalendar();
const lastRow = sheet.getLastRow();
const dataRange = sheet.getRange(2, 1, lastRow - 1, 4);
const rows = dataRange.getValues();
rows.forEach((row, index) => {
const [title, startTime, endTime, registeredFlag] = row;
if (registeredFlag === registeredMark) {
return;
}
if (!title || !startTime || !endTime) {
return;
}
calendar.createEvent(String(title), new Date(startTime), new Date(endTime));
sheet.getRange(index + 2, 4).setValue(registeredMark);
});
} rows.forEach がシートの各行を順番に確認し、D列がすでに登録済みの行はそこで処理を止めて次の行に進みます。
タイトル・開始日時・終了日時のいずれかが空の行も同じように飛ばすため、入力途中の行が誤って登録される事故を防げます。
条件をすべて満たした行だけが calendar.createEvent でカレンダーに書き込まれ、直後に同じ行のD列へ登録済みという文字が入ります。
Step3. 1件だけでテストする
いきなり全件を登録する前に、シートの2行目だけを対象に動作を確認します。
3行目以降の予定は一時的に別のシートへ退避しておくと安全です。
準備ができたらスクリプトエディタの実行ボタンを押します。
初回実行時は権限の承認画面が表示されるため、内容を確認して許可を進めてください。
実行が終わったらGoogleカレンダーを開き、指定した日時で予定が登録されているかを確認します。
あわせてシートのD列にも登録済みという文字が入っているかを見ておきます。
Step4. シート全体を対象に実行する
テストで問題がなければ、退避しておいた予定行を元に戻します。
そのうえで、もう一度スクリプトエディタから同じ関数を実行すると、D列が空欄の行だけがまとめて登録されます。
すでに登録済みの2行目は処理をスキップするため、二重登録は起きません。
予定を追加するたびに毎回手動で実行するのが手間な場合は、スクリプトエディタの時計マークからトリガーを追加し、時間主導型で1時間おきなどに自動実行する設定も組み合わせられます。
どの業務から自動化を始めるべきか判断に迷う場合は、優先順位の付け方を別記事で整理しています。

二重登録を防ぐ仕組み
このスクリプトが二重登録を防いでいるのは、D列の登録済みフラグと処理のスキップ条件が連動しているためです。
registeredFlag === registeredMark の判定が、過去に登録済みの行をその場で除外します。
そして登録が終わった直後にD列へ文字を書き込むことで、次回以降の実行でその行が確実に除外される状態を作っています。
このためスクリプトを何度実行しても、すでに登録済みの予定が重複してカレンダーに増えることはありません。
反対にD列の文字を手動で消してしまうと、その行は未登録として扱われ、実行のたびに同じ予定が登録され続けます。
運用ルールとしてD列は手で編集しない列と決めておくと、事故を防ぎやすくなります。
登録後に予定が近づいたタイミングで担当者へ思い出させたい場合は、リマインダー送信を組み合わせる方法も参考になります。

Google Apps Scriptでのカレンダー登録について相談してみませんか。
「予定表の列構成をどう設計すればいいか分からない」「複数の担当者用カレンダーに振り分けたい」「社内にGoogle Apps Scriptを設計できる人材がいない」。
少しでも心当たりがあれば、お気軽にご相談ください。
現在、Google Apps Scriptを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 一度に登録できる予定の件数に上限はありますか。
明確な件数上限はありませんが、Google Apps Scriptには1回の実行につき6分までという実行時間の上限があります。
数百件を超える予定を一括登録する場合は、シートを分割するか、処理する行数を絞って複数回に分けて実行してください。
Q. 個人のカレンダーではなく共有カレンダーに登録できますか。
登録できます。
コード内の CalendarApp.getDefaultCalendar() を CalendarApp.getCalendarById('カレンダーID') に書き換えれば、指定した共有カレンダーへ登録されます。
カレンダーIDはGoogleカレンダーの設定画面から確認できます。
Q. 開始日時と終了日時の入力形式にルールはありますか。
スプレッドシート側のセルが日付と時刻を認識できる形式であれば、コードを変更する必要はありません。
セルが文字列として扱われている場合は new Date() が正しく変換できず、登録される日時がずれることがあるため、入力後にセルの表示形式を確認してください。
Q. 途中で予定の内容を修正したい場合はどうすればいいですか。
このスクリプトは新規登録だけを行う作りのため、登録済みの予定をシート側で修正してもカレンダー側には反映されません。
修正した予定を反映したい場合は、対象行のD列を空欄に戻したうえで、Googleカレンダー側の該当する予定を手動で削除してから再実行してください。