# GASでスプレッドシートからGoogleカレンダーに予定を一括登録する方法

Google Apps Script (GAS) で、スプレッドシートに並べた日時・件名・場所から Google カレンダーへ予定をまとめて登録する方法を、コピーして使えるコード付きで解説します。二重登録を防ぐ予定 ID の記録、終日の予定、共有カレンダーへの登録、招待メールの送り方、1日の作成数の上限まで公式ドキュメントで確かめました。

<Points>

- スプレッドシートに日付・開始・終了・件名を並べ、GAS の `CalendarApp` の `createEvent` で 1 行ずつ登録すれば、予定をまとめてカレンダーに入れられる
- 登録した予定の ID をシートに書き戻しておけば、もう一度実行しても同じ予定が二重に入らない
- 1 日に作れる予定の数は、個人の Google アカウントで 5,000、Google Workspace で 10,000 が上限

</Points>

## スプレッドシートから予定を登録すると何が楽になるか

研修の日程、店舗のシフト、取引先との定例など、表で管理している予定を 1 件ずつ Google カレンダーに打ち直していると、時間がかかるうえに日付や時刻の写し間違いが起きます。

Google Apps Script (GAS) を使うと、スプレッドシートの行をそのままカレンダーの予定として登録できます。追加のソフトは要らず、Google アカウントがあれば使えます。

<Compare>
<Column title="手で登録する場合">

- 1 件ずつ日時と件名を打ち直す
- 写し間違いに気づきにくい
- 登録済みかどうかを別に覚えておく

</Column>
<Column title="GASで登録する場合" tone="accent">

- シートの行をまとめて登録する
- 表の値がそのまま予定になる
- 登録済みの行に予定 ID が残る

</Column>
</Compare>

## 準備するスプレッドシート

新しいスプレッドシートを作り、シートの名前を「予定リスト」に変えて、1 行目に次の見出しを入れます。2 行目から予定を 1 行に 1 件ずつ書きます。

<Figure title="予定リストのシートの形" caption="G 列は空のままにしておきます。登録した行にスクリプトが予定 ID を書き込みます。">

| | 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 回目 | オンライン | | |

</Figure>

A 列は日付、B 列と C 列は時刻として入力します。セルの左上に「2026/12/01」「10:00」のように入れれば、スプレッドシートが日付と時刻として扱います。文字として入ってしまうと計算できないので、[表示形式] > [数字] で日付や時刻になっているかを確かめておきます。

## コピーして使えるコード

スプレッドシートの上部のメニューから [拡張機能] > [Apps Script] を開き、最初から入っているコードを消して、次のコードを貼り付けて保存します。

```js
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` は登録先のカレンダーです。空のままなら自分のメインのカレンダーに入ります。

### コードがしていること

<Flow
  title="registerEvents の流れ"
  caption="G 列が空の行だけを登録し、登録した行に予定 ID を書き込みます。"
  steps={[
    { label: "シートを読む", note: "2 行目から最終行まで", by: "ai" },
    { label: "登録する行を選ぶ", note: "日付と件名があり G 列が空", by: "ai" },
    { label: "日付と時刻を合わせる", note: "開始・終了の日時を作る", by: "ai" },
    { label: "予定を作る", note: "createEvent", by: "ai" },
    { label: "G 列に予定 ID を記録", note: "二重登録を防ぐ", by: "ai" },
  ]}
/>

予定の登録には `createEvent(件名, 開始日時, 終了日時, オプション)` を使っています。[公式リファレンス](https://developers.google.com/apps-script/reference/calendar/calendar-app)によると、オプションには説明の `description`、場所の `location`、ゲストの `guests`、招待メールを送るかどうかの `sendInvites` を指定できます。時刻は、タイムゾーンを指定しなければスクリプトのタイムゾーンで扱われます。

シートでは日付と時刻が別の列に入っているので、`combine` という小さな関数で「A 列の日付」に「B 列 (または C 列) の時と分」を合わせ、開始と終了の日時を作っています。

## 実行して動きを確かめる

<Steps>
<Step title="1 行だけで試す">

最初は予定リストの 2 行目に試しの予定を 1 件だけ入れ、登録先が自分のカレンダーのままになっているかを確かめます。

</Step>
<Step title="関数を選んで実行する">

Apps Script の画面の上部で `registerEvents` を選び、[実行] を押します。

</Step>
<Step title="初回だけアクセスを許可する">

初めて実行すると、カレンダーとスプレッドシートへのアクセスの許可を求める画面が出ます。自分のアカウントを選んで許可します。予定の作成には `https://www.googleapis.com/auth/calendar` の権限が使われます。

</Step>
<Step title="カレンダーと G 列を確かめる">

Google カレンダーに予定が入り、G 列に予定 ID が書き込まれていれば成功です。確認できたら残りの予定を並べて実行します。

</Step>
</Steps>

<Note tone="caution">

時刻がずれて登録されるときは、スクリプトのタイムゾーンを確かめます。Apps Script の画面の左側の [プロジェクトの設定] で、タイムゾーンが日本の時刻 (GMT+09:00) になっているかを見ます。スプレッドシートのタイムゾーン ([ファイル] > [設定]) とは別の設定なので、両方をそろえておきます ([公式ガイド](https://developers.google.com/apps-script/guides/projects))。

</Note>

## 共有カレンダーに登録する

チームの共有カレンダーなど、メイン以外のカレンダーに入れたいときは、コードの `CALENDAR_ID` にそのカレンダーの ID を入れます。

カレンダーの ID は、ブラウザで Google カレンダーを開き、左側のカレンダー名の横のメニューから設定画面を開くと表示されます。[Google の開発者向けガイド](https://developers.google.com/workspace/calendar/caldav/v2/guide?hl=ja)によると、メインのカレンダーの ID は自分のメールアドレスと同じです。

`getCalendarById` は、カレンダーが存在しないとき、アクセスできないとき、登録 (購読) していないときに `null` を返します。このコードではそのときにエラーで止めているので、「カレンダーが見つかりません」と出たら ID と権限を見直します。予定を作るには、そのカレンダーに予定を変更できる権限が要ります。

## 終日の予定やゲストの招待

### 終日の予定にする

時刻のない休業日や締め切りは、`createEvent` の代わりに `createAllDayEvent(件名, 日付)` を使うと終日の予定として登録できます。複数日にまたがる予定は `createAllDayEvent(件名, 開始日, 終了日)` で作れますが、[公式リファレンス](https://developers.google.com/apps-script/reference/calendar/calendar-app)のとおり終了日はその日を含みません。12 月 1 日から 3 日までの予定なら、終了日には 12 月 4 日を渡します。

### ゲストを招待する

予定に参加者を入れるには、オプションに `guests` (メールアドレスをカンマで区切った文字列) を足します。初期設定では招待メールは送られないので、相手に通知したいときは `sendInvites: true` も指定します。

```js
calendar.createEvent(title, startAt, endAt, {
  guests: "tanaka@example.com,suzuki@example.com",
  sendInvites: true,
});
```

<Figure title="createEvent で指定できるオプション" caption="2026年11月11日時点の公式リファレンスの内容です。" source="Google Apps Script リファレンス (Class CalendarApp)">

| オプション | できること |
|---|---|
| `description` | 予定の説明 |
| `location` | 予定の場所 |
| `guests` | ゲストのメールアドレス (カンマ区切り) |
| `sendInvites` | 招待メールを送るかどうか (初期値は送らない) |

</Figure>

## 登録した予定を直す・消す

G 列に残した予定 ID を使うと、あとから予定を探して直せます。`getEventById` に ID を渡すと予定が取り出せ、件名を変える `setTitle`、日時を変える `setTime`、削除する `deleteEvent` などが使えます ([公式リファレンス](https://developers.google.com/apps-script/reference/calendar/calendar-event))。

```js
function deleteEvent(eventId) {
  const event = CalendarApp.getDefaultCalendar().getEventById(eventId);
  if (event) event.deleteEvent();
}
```

<Note tone="info">

メイン以外のカレンダーの予定を探すときは、`CalendarApp.getDefaultCalendar()` ではなく、そのカレンダー (`CalendarApp.getCalendarById(ID)`) の `getEventById` を使います。メインのカレンダーから探しても、ほかのカレンダーの予定は見つかりません。

</Note>

## 作れる予定の数の上限

GAS から作れる予定の数には 1 日の上限があります。

<BarChart
  title="1 日に作れるカレンダーの予定の数"
  source="Google Apps Script の割り当て (Quotas for Google Services)"
  unit="件"
  data={[
    { label: "個人の Google アカウント", value: 5000, display: "5,000件" },
    { label: "Google Workspace", value: 10000, display: "10,000件", highlight: true },
  ]}
/>

[公式の割り当ての一覧](https://developers.google.com/apps-script/guides/services/quotas)によると、1 回の実行は 6 分までです。数百件程度なら問題になりにくいですが、数千件を一度に入れると途中で止まることがあります。このコードは G 列に予定 ID がある行を飛ばすので、止まってもう一度実行すれば続きから登録されます。

## 自分で作るのが難しいときは

ここで紹介したコードは、シートの行を予定として登録するだけの最小の形です。実際の業務では「シートを直したらカレンダーも直したい」「担当者ごとに別のカレンダーへ振り分けたい」「フォームで受けた予約をそのまま入れたい」といった条件が加わり、作り込むほど手間がかかります。

自分で直すのが難しい、止まったときに直せる人が社内にいない、という場合は、作る部分だけを外部に任せるのも一つの方法です。シートナビでは、GAS での自動化の相談を受け付けています。お困りのときは[相談フォーム](/contact/)からお気軽にご連絡ください。

## よくある質問

### Q. シートを編集したら自動でカレンダーに登録できますか？

インストール型のトリガーを付けると、決まった時刻や編集のたびに `registerEvents` を動かせます。毎朝まとめて登録するなら時間主導型のトリガーが手軽です。設定の手順は [GASのトリガーの使い方](/gas-trigger/) で説明しています。

### Q. 同じ予定が二重に登録されてしまいます。

このコードは G 列に予定 ID がある行を飛ばします。G 列を消したり、行を並べ替えたあとに G 列だけ残っていたりすると、二重登録や登録漏れの原因になります。行を並べ替えるときは G 列も含めて並べ替えてください。

### Q. カレンダーの予定をスプレッドシートに書き出すこともできますか？

できます。カレンダーの `getEvents(開始日時, 終了日時)` でその期間の予定を取り出し、件名や日時をシートに書き込みます。登録とは逆の向きの処理なので、別の関数として作ります。
