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

GAS×Googleカレンダー連携ガイド|予定を自動追加
しんたろ。

スプレッドシートの予定をGoogleカレンダーに手作業で入力していませんか?GASなら、ボタン1つで一括追加できます!

この記事でわかること
  • CalendarAppの基本とカレンダーIDの確認方法
  • スプレッドシートの予定をカレンダーに一括追加するGASコード
  • Googleフォーム送信時にカレンダーへ自動登録する方法
  • カレンダーの予定をスプレッドシートに書き出す方法
  • 日時形式エラー・権限エラーなどよくあるトラブルの対処法

GAS × Googleカレンダー連携でできること

Google Apps Script(GAS)CalendarAppクラスを使えば、Googleカレンダーの予定をプログラムで自動操作できます。手作業で1件ずつ予定を入力する必要がなくなり、業務効率が大幅に向上します。

この記事では、実務で特にニーズの高い3つのユースケースを、コピペで使えるGASコード付きで解説します。

3つのユースケース
  • ケース①:スプレッドシートの予定を一括でカレンダーに追加(最も人気)
  • ケース②:Googleフォーム送信時に自動でカレンダーに予定追加
  • ケース③:カレンダーの予定を毎週スプレッドシートに書き出す
GASによるスプレッドシートとGoogleカレンダーの連携フロー図
GAS×Googleカレンダー連携の3つのユースケース概要図

GASの基本がまだわからない方は、先に「GAS入門ガイド」を読んでから本記事に進むとスムーズです。

事前準備:CalendarApp の基本と権限設定

GASからGoogleカレンダーを操作するには、CalendarAppクラスを使います。まずは基本となるカレンダーIDの確認方法と、権限承認の手順を押さえましょう。

カレンダーIDの確認方法

デフォルトカレンダー(自分のメインカレンダー)を使う場合は、IDの指定は不要です。CalendarApp.getDefaultCalendar()で取得できます。

特定のカレンダー(チーム共有カレンダーなど)を使う場合は、以下の手順でカレンダーIDを確認します。

  1. Googleカレンダーを開く
  2. 左サイドバーで対象カレンダーの「⋮」→「設定と共有」をクリック
  3. 「カレンダーの統合」セクションにあるカレンダー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の権限承認画面が表示されます。以下の手順で承認してください。

  1. スクリプトエディタで「▶ 実行」をクリック
  2. 「承認が必要です」ダイアログで「権限を確認」をクリック
  3. Googleアカウントを選択
  4. 「このアプリはGoogleで確認されていません」と表示されたら「詳細」→「○○(安全でないページ)に移動」をクリック
  5. 「許可」をクリックして完了
ポイント

「安全でないページ」という警告は、自分で作成したスクリプトが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フォームで以下の項目を設定します。

  1. Googleフォームを新規作成
  2. 以下の質問を追加:予定タイトル(記述式)、開始日時(日付+時刻)、終了日時(日付+時刻)、場所(記述式)
  3. 「回答」タブ → スプレッドシートアイコン → 「新しいスプレッドシートを作成」で回答先を設定
  4. 連携されたスプレッドシートの「拡張機能」→「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);
}

コードを保存したら、トリガーの設定を行います。

  1. スクリプトエディタ左の「⏰(トリガー)」アイコンをクリック
  2. 右下の「+ トリガーを追加」をクリック
  3. 以下のように設定:
設定項目 選択値
実行する関数 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にスコープが不足しています。

対処法

  1. スクリプトエディタで関数を手動実行し、権限の承認画面で「許可」をクリック
  2. それでも解消しない場合は、「プロジェクトの設定」→「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件以上は日をまたいで実行する
GASの主な制限値
  • スクリプト実行時間:無料アカウント 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で他の人のカレンダーにも予定を追加できますか?
はい、共有カレンダーであればCalendarApp.getCalendarById()でカレンダーIDを指定して追加可能です。ただし、対象カレンダーの「変更及び共有の管理権限」が必要です。
GASで終日イベントを登録するにはどうすればよいですか?
createAllDayEvent(title, date)メソッドを使います。第2引数にDateオブジェクトで日付を指定するだけで、時間指定なしの終日イベントが登録されます。
GASで一度に何件まで予定を追加できますか?
GASの実行時間制限(無料アカウント6分)と、カレンダーAPIの短時間呼び出し制限があります。Utilities.sleep(1000)でウェイトを入れた場合、6分間で約300件が目安です。100件以上の大量登録ではバッチ分割を検討してください。
GASで登録した予定を後から変更・削除するには?
getEventById()でイベントオブジェクトを取得し、setTitle()で件名変更、setTime()で日時変更、deleteEvent()で削除ができます。スプレッドシートにイベントIDを記録しておくと管理が容易になります。
GASの無料枠の制限はありますか?
無料Googleアカウントでは実行時間6分/回、トリガー実行時間合計90分/日の制限があります。Google Workspaceアカウントでは30分/回に拡張されます。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
記事URLをコピーしました