Amazon10/19まで!プライム感謝祭開催中!セール会場へ

スプレッドシートからGoogleカレンダーに予定を自動登録する方法|重複を防ぐGAS

スプレッドシートからGoogleカレンダーに予定を自動登録する方法(Googleメソッドのロゴと記事タイトル)

スプレッドシートからGoogleカレンダーに予定を自動で登録するには、予定の一覧を表にしておき、GAS(Google Apps Script)で1行ずつ CalendarApp の createEvent を呼びます。

同じ予定が何度も登録されないように、登録した予定のIDを表に書き戻し、IDがある行は飛ばすのがポイントです。

この記事は、イベントや訪問の予定をスプレッドシートで管理していて、カレンダーへの入力を手で繰り返したくない方に向けたものです。

掲載したコードは、2026年10月15日にNode.jsの模擬環境で、時刻ありと終日の分け方、登録済みの行を飛ばす処理、時刻の誤りの検出を確かめました。

実際のGoogleカレンダーへの登録は試していないため、使う前にテスト用の行で確かめてください。

目次

表を用意する

「予定」という名前のシートに、次の列を作ります。

列入れるもの例
Aタイトル定例会議
B日付2026/10/20
C開始時刻(終日なら空欄)10:00
D終了時刻(終日なら空欄)11:30
E場所会議室A
F説明週次の進捗確認
G登録済みID(空欄のまま始める)スクリプトが書き込む
Hメモ(空欄のまま始める)エラーがあれば書き込む
予定シートの列

日付と時刻は、文字ではなく日付・時刻としてセルに入れます。

文字として入っていると、スクリプトはその行を飛ばします。

コード

スプレッドシートの「拡張機能」から「Apps Script」を開き、次のコードを貼り付けて保存します。

// スプレッドシートに紐づいたスクリプトに貼り付けて使う
// 列:A タイトル/B 日付/C 開始時刻/D 終了時刻/E 場所/F 説明/G 登録済みID/H メモ(G・Hは空欄のまま始める)
const SHEET_NAME = '予定';
const CALENDAR_ID = ''; // 空欄ならデフォルトのカレンダー。別のカレンダーはIDを入れる

function registerEvents() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const calendar = CALENDAR_ID ? CalendarApp.getCalendarById(CALENDAR_ID) : CalendarApp.getDefaultCalendar();
  const values = sheet.getDataRange().getValues();

  for (let i = 1; i < values.length; i++) { // 1行目は見出し
    const [title, date, start, end, location, description, registeredId] = values[i];
    if (!title || !(date instanceof Date) || registeredId) {
      continue; // タイトルか日付がない行と、登録済みの行は飛ばす
    }

    let event;
    if (start instanceof Date && end instanceof Date) {
      const startTime = combine(date, start);
      const endTime = combine(date, end);
      if (endTime <= startTime) {
        sheet.getRange(i + 1, 8).setValue('終了時刻が開始時刻より前です');
        continue;
      }
      event = calendar.createEvent(title, startTime, endTime, { location: location, description: description });
    } else {
      event = calendar.createAllDayEvent(title, date, { location: location, description: description });
    }
    sheet.getRange(i + 1, 7).setValue(event.getId()); // 二重登録を防ぐためにIDを残す
    sheet.getRange(i + 1, 8).setValue('');
  }
}

function combine(date, time) {
  return new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes());
}

エディタで関数「registerEvents」を選んで実行し、カレンダーへのアクセスを許可すると、予定が登録されます。

コードの動き

処理していること
登録済みの確認G列にIDがある行と、タイトルか日付がない行は飛ばす
時刻ありの予定日付と時刻を組み合わせて createEvent で登録する
終日の予定開始時刻と終了時刻が空欄なら createAllDayEvent で登録する
時刻の誤り終了時刻が開始時刻より前なら登録せず、H列にメモを書く
IDの書き戻し登録した予定のIDをG列に書き、次からは飛ばす
registerEventsの処理

Apps Scriptのリファレンスでは、createEvent はタイトル、開始と終了の日時、場所や説明などのオプションを受け取り、作った予定を返すと説明されています(Apps Script:Class Calendar)。

CALENDAR_ID を空欄にすると、自分のデフォルトのカレンダーに登録されます。

共有のカレンダーなど別のカレンダーに登録する場合は、そのカレンダーの設定画面に表示されるカレンダーIDを入れます。

タイムゾーンに注意する

リファレンスでは、createEvent でタイムゾーンを指定しない場合、時刻はスクリプトのタイムゾーンで解釈され、カレンダーのタイムゾーンと違うことがあると説明されています。

Apps Scriptのプロジェクトの設定で、タイムゾーンが日本(東京)など、実際に使う地域になっているかを確かめてください。

予定の時刻が数時間ずれて登録される場合は、まずここを確かめます。

招待メールと上限

参加者を招待したい場合は、オプションに guests(カンマ区切りのメールアドレス)を加えます。

リファレンスでは、招待メールを送るかどうかを決める sendInvites の初期値は false と説明されています。

Apps Scriptの上限の一覧では、1日に作れるカレンダーの予定は、無料のアカウントで5,000件、Google Workspaceのアカウントで10,000件、1回の実行時間は6分までとなっています(Apps Script:Quotas for Google Services)。

一度に大量の行を登録する場合は、6分を超えないように何回かに分けて実行します。

実行時間の制限への対処は、getValuesとsetValuesで一括処理する方法も参考になります。

自動で実行する

新しい行を追加したら自動で登録したい場合は、時間主導型のトリガーで、1時間ごとなどに registerEvents を実行させます。

G列のIDで登録済みの行を飛ばすため、何度実行しても同じ予定が重複して作られません。

トリガーの設定方法は、GASのトリガーの設定方法で説明しています。

登録した後に確かめること

  • カレンダーで、予定の日付と時刻が表と同じになっている
  • 終日の予定が、終日として表示されている
  • G列にIDが入り、もう一度実行しても予定が増えない
  • H列にメモが出た行の時刻を直し、メモを消して再度実行した

表から予定を消しても、カレンダーの予定は自動では消えません。

予定を取り消す場合は、カレンダー側でも削除してください。

祝日や休日にスクリプトを動かさないようにしたい場合は、祝日・休日・指定した日はスクリプトをスキップする方法を参考にしてください。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

スプレッドシート・GASのおすすめ書籍

作業環境の作り方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次