スプレッドシートから予定を登録すると何が楽になるか
研修の日程、店舗のシフト、取引先との定例など、表で管理している予定を 1 件ずつ Google カレンダーに打ち直していると、時間がかかるうえに日付や時刻の写し間違いが起きます。
Google Apps Script (GAS) を使うと、スプレッドシートの行をそのままカレンダーの予定として登録できます。追加のソフトは要らず、Google アカウントがあれば使えます。
手で登録する場合
- 1 件ずつ日時と件名を打ち直す
- 写し間違いに気づきにくい
- 登録済みかどうかを別に覚えておく
GASで登録する場合
- シートの行をまとめて登録する
- 表の値がそのまま予定になる
- 登録済みの行に予定 ID が残る
準備するスプレッドシート
新しいスプレッドシートを作り、シートの名前を「予定リスト」に変えて、1 行目に次の見出しを入れます。2 行目から予定を 1 行に 1 件ずつ書きます。
予定リストのシートの形
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | 日付 | 開始 | 終了 | 件名 | 場所 | メモ | 予定ID |
| 2 | 2026/12/01 | 10:00 | 11:00 | 新人研修 1 回目 | 本社 3F 会議室 | 資料は前日配布 | |
| 3 | 2026/12/08 | 10:00 | 11:30 | 新人研修 2 回目 | オンライン |
A 列は日付、B 列と C 列は時刻として入力します。セルの左上に「2026/12/01」「10:00」のように入れれば、スプレッドシートが日付と時刻として扱います。文字として入ってしまうと計算できないので、[表示形式] > [数字] で日付や時刻になっているかを確かめておきます。
コピーして使えるコード
スプレッドシートの上部のメニューから [拡張機能] > [Apps Script] を開き、最初から入っているコードを消して、次のコードを貼り付けて保存します。
const SHEET_NAME = "予定リスト";
const CALENDAR_ID = ""; // 空のときは自分のメインのカレンダーに登録する
function combine(date, time) {
const d = new Date(date);
d.setHours(time.getHours(), time.getMinutes(), 0, 0);
return d;
}
function registerEvents() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const lastRow = sheet.getLastRow();
if (lastRow < 2) return;
const calendar = CALENDAR_ID
? CalendarApp.getCalendarById(CALENDAR_ID)
: CalendarApp.getDefaultCalendar();
if (!calendar) throw new Error("カレンダーが見つかりません。ID と権限を確かめてください。");
const rows = sheet.getRange(2, 1, lastRow - 1, 7).getValues();
rows.forEach((row, index) => {
const [date, start, end, title, location, memo, eventId] = row;
if (!date || !title || eventId) return;
const event = calendar.createEvent(title, combine(date, start), combine(date, end), {
location: location,
description: memo,
});
sheet.getRange(index + 2, 7).setValue(event.getId());
});
}
書き換えるのは上の 2 行だけです。SHEET_NAME はシートの名前、CALENDAR_ID は登録先のカレンダーです。空のままなら自分のメインのカレンダーに入ります。
コードがしていること
registerEvents の流れ
- AIシートを読む2 行目から最終行まで
- AI登録する行を選ぶ日付と件名があり G 列が空
- AI日付と時刻を合わせる開始・終了の日時を作る
- AI予定を作るcreateEvent
- AIG 列に予定 ID を記録二重登録を防ぐ
予定の登録には createEvent(件名, 開始日時, 終了日時, オプション) を使っています。公式リファレンスによると、オプションには説明の description、場所の location、ゲストの guests、招待メールを送るかどうかの sendInvites を指定できます。時刻は、タイムゾーンを指定しなければスクリプトのタイムゾーンで扱われます。
シートでは日付と時刻が別の列に入っているので、combine という小さな関数で「A 列の日付」に「B 列 (または C 列) の時と分」を合わせ、開始と終了の日時を作っています。
実行して動きを確かめる
1 行だけで試す
最初は予定リストの 2 行目に試しの予定を 1 件だけ入れ、登録先が自分のカレンダーのままになっているかを確かめます。
関数を選んで実行する
Apps Script の画面の上部で
registerEventsを選び、[実行] を押します。初回だけアクセスを許可する
初めて実行すると、カレンダーとスプレッドシートへのアクセスの許可を求める画面が出ます。自分のアカウントを選んで許可します。予定の作成には
https://www.googleapis.com/auth/calendarの権限が使われます。カレンダーと G 列を確かめる
Google カレンダーに予定が入り、G 列に予定 ID が書き込まれていれば成功です。確認できたら残りの予定を並べて実行します。
共有カレンダーに登録する
チームの共有カレンダーなど、メイン以外のカレンダーに入れたいときは、コードの CALENDAR_ID にそのカレンダーの ID を入れます。
カレンダーの ID は、ブラウザで Google カレンダーを開き、左側のカレンダー名の横のメニューから設定画面を開くと表示されます。Google の開発者向けガイドによると、メインのカレンダーの ID は自分のメールアドレスと同じです。
getCalendarById は、カレンダーが存在しないとき、アクセスできないとき、登録 (購読) していないときに null を返します。このコードではそのときにエラーで止めているので、「カレンダーが見つかりません」と出たら ID と権限を見直します。予定を作るには、そのカレンダーに予定を変更できる権限が要ります。
終日の予定やゲストの招待
終日の予定にする
時刻のない休業日や締め切りは、createEvent の代わりに createAllDayEvent(件名, 日付) を使うと終日の予定として登録できます。複数日にまたがる予定は createAllDayEvent(件名, 開始日, 終了日) で作れますが、公式リファレンスのとおり終了日はその日を含みません。12 月 1 日から 3 日までの予定なら、終了日には 12 月 4 日を渡します。
ゲストを招待する
予定に参加者を入れるには、オプションに guests (メールアドレスをカンマで区切った文字列) を足します。初期設定では招待メールは送られないので、相手に通知したいときは sendInvites: true も指定します。
calendar.createEvent(title, startAt, endAt, {
guests: "tanaka@example.com,suzuki@example.com",
sendInvites: true,
});
createEvent で指定できるオプション
| オプション | できること |
|---|---|
description | 予定の説明 |
location | 予定の場所 |
guests | ゲストのメールアドレス (カンマ区切り) |
sendInvites | 招待メールを送るかどうか (初期値は送らない) |
登録した予定を直す・消す
G 列に残した予定 ID を使うと、あとから予定を探して直せます。getEventById に ID を渡すと予定が取り出せ、件名を変える setTitle、日時を変える setTime、削除する deleteEvent などが使えます (公式リファレンス)。
function deleteEvent(eventId) {
const event = CalendarApp.getDefaultCalendar().getEventById(eventId);
if (event) event.deleteEvent();
}
作れる予定の数の上限
GAS から作れる予定の数には 1 日の上限があります。
1 日に作れるカレンダーの予定の数
公式の割り当ての一覧によると、1 回の実行は 6 分までです。数百件程度なら問題になりにくいですが、数千件を一度に入れると途中で止まることがあります。このコードは G 列に予定 ID がある行を飛ばすので、止まってもう一度実行すれば続きから登録されます。
自分で作るのが難しいときは
ここで紹介したコードは、シートの行を予定として登録するだけの最小の形です。実際の業務では「シートを直したらカレンダーも直したい」「担当者ごとに別のカレンダーへ振り分けたい」「フォームで受けた予約をそのまま入れたい」といった条件が加わり、作り込むほど手間がかかります。
自分で直すのが難しい、止まったときに直せる人が社内にいない、という場合は、作る部分だけを外部に任せるのも一つの方法です。シートナビでは、GAS での自動化の相談を受け付けています。お困りのときは相談フォームからお気軽にご連絡ください。
よくある質問
シートを編集したら自動でカレンダーに登録できますか?
インストール型のトリガーを付けると、決まった時刻や編集のたびに registerEvents を動かせます。毎朝まとめて登録するなら時間主導型のトリガーが手軽です。設定の手順は GASのトリガーの使い方 で説明しています。
同じ予定が二重に登録されてしまいます。
このコードは G 列に予定 ID がある行を飛ばします。G 列を消したり、行を並べ替えたあとに G 列だけ残っていたりすると、二重登録や登録漏れの原因になります。行を並べ替えるときは G 列も含めて並べ替えてください。
カレンダーの予定をスプレッドシートに書き出すこともできますか?
できます。カレンダーの getEvents(開始日時, 終了日時) でその期間の予定を取り出し、件名や日時をシートに書き込みます。登録とは逆の向きの処理なので、別の関数として作ります。


