業務効率化

GASでスプレッドシートからGoogleカレンダーへ自動登録する方法【完全コード付き・コピペOK】

毎月の予定入力、手作業でカレンダーに1件ずつ登録していませんか。スプレッドシートに書いた予定を、また別のウィンドウを開いてカレンダーにコピーして……という二度手間は、件数が増えるほど地味に時間を奪っていきます。10件程度なら我慢できても、30件・50件になると入力だけで30分以上かかることもあります。

この「コピペ登録」には、よくこんな悩みが重なります。

  • 予定が10件以上になると入力ミスが増える
  • スプレッドシートとカレンダーで情報がズレてしまう
  • メンバーが多いと誰かが登録漏れを起こす

本記事では、Google Apps Script(GAS)を使ってスプレッドシートの予定データをGoogleカレンダーへ一括登録する方法を、完全なコードと手順付きで解説します。スプレッドシートのフォーマット説明・コードの各行解説・よくあるエラーの対処法・応用パターン・トリガー設定まで網羅します。プログラミング未経験の方でも、記事の通りに進めれば今日中に動かせます。


スプレッドシートに「予定の一覧」を作る。フォーマットの詳細

まず、登録したい予定をスプレッドシートに整理します。必要な列は5つです。

内容入力例必須/任意
A列件名(カレンダーに表示するタイトル)月次定例会議必須
B列開始日時2026/06/01 10:00必須
C列終了日時2026/06/01 11:00必須
D列場所(カレンダーの「場所」欄に入る)第1会議室任意
E列メモ(カレンダーの「説明」欄に入る)議事録Googleドキュメント参照任意

日時フォーマットについて重要なポイントが3つあります。

① 「2026/06/01 10:00」の形式を使う。スラッシュ区切りで年月日、スペースの後に時刻を書きます。

② スプレッドシートのセルの書式を「日時」に設定する。セルを選択して「表示形式」→「数字」→「日時」で設定します。「テキスト」書式のままだとGASが正しく読み取れないことがあります。

③ 1行目はヘッダー行として使う。「件名」「開始日時」「終了日時」「場所」「メモ」などと入力しておき、GASはデータを2行目から読み込む設定にします。

スプレッドシートに予定データが入力された画面

日時のフォーマットはスプレッドシートの「書式設定」で「日時」に変更しておくと、GASが確実に認識します。セルが「テキスト」書式のままだと認識エラーが出やすいので注意してください。スプレッドシートで日時を入力すると自動的に「日時」書式になることが多いですが、確認しておくと安心です。


スクリプトエディタを開く手順

スプレッドシートを開いた状態で、上部メニューから「拡張機能」→「Apps Script」をクリックします。別タブでスクリプトエディタが開きます。

初めて開くと `function myFunction() {}` という空の関数が表示されています。これを全部削除して、次のコードを貼り付けてください。


コードの各行を解説しながら読む。完全版GASコード

以下のコードを貼り付けてください。各行にコメントを入れているので、何をしているかを確認しながら読めます。


function registerToCalendar() {
  // 【1】スプレッドシートとカレンダーの取得
  // SpreadsheetApp.getActiveSpreadsheet() は現在開いているスプレッドシートを取得します
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // 'primary'は自分のメインカレンダーを意味します
  // 別のカレンダーに登録したい場合は後述の「カレンダーID」に変更します
  var calendarId = 'primary';
  var calendar = CalendarApp.getCalendarById(calendarId);

  // 【2】スプレッドシートのデータ範囲を取得
  // getLastRow()はデータが入っている最終行の番号を返します
  var lastRow = sheet.getLastRow();
  
  // データが1行しかない(ヘッダーのみ)場合はアラートを出して終了します
  if (lastRow < 2) {
    SpreadsheetApp.getUi().alert('データがありません。2行目以降に予定を入力してください。');
    return; // ここで関数を終了します
  }
  
  // getRange(開始行, 開始列, 行数, 列数) でデータ範囲を指定します
  // 2行目から最終行まで、1列目から5列目(A〜E)を取得します
  var dataRange = sheet.getRange(2, 1, lastRow - 1, 5);
  
  // getValues()は範囲内のデータを二次元配列として返します
  // data[0][0]はA列1行目、data[0][1]はB列1行目、という形式です
  var data = dataRange.getValues();

  // 【3】登録件数のカウンターを初期化します
  var successCount = 0; // 登録成功件数
  var skipCount = 0;    // スキップ件数(件名や日付が空の行)

  // 【4】データを1行ずつ処理するループ
  for (var i = 0; i < data.length; i++) {
    var row = data[i]; // i番目の行データ(配列)を取得します
    
    // 各列のデータを変数に格納します
    var title = row[0];       // A列: 件名
    var startTime = row[1];   // B列: 開始日時
    var endTime = row[2];     // C列: 終了日時
    var location = row[3] || '';    // D列: 場所(空の場合は空文字にします)
    var description = row[4] || ''; // E列: メモ(空の場合は空文字にします)

    // 【5】必須項目が空の場合はスキップします
    if (!title || !startTime || !endTime) {
      skipCount++;
      continue; // continueは次のループへ進む命令です
    }

    // 【6】日時をDateオブジェクトに変換します
    // Dateオブジェクトはプログラムが時刻を扱うための形式です
    var startDate = new Date(startTime);
    var endDate = new Date(endTime);

    // 【7】日付の形式が正しいかチェックします
    // isNaN(date.getTime())はDateが無効な値かどうかを確認します
    if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
      Logger.log('日付の形式エラー(行 ' + (i + 2) + '): ' + title);
      skipCount++;
      continue;
    }

    // 【8】Googleカレンダーに予定を追加します
    // createEvent(件名, 開始日時, 終了日時, オプション) の形式です
    var event = calendar.createEvent(title, startDate, endDate, {
      location: location,
      description: description
    });

    // 【9】ログに登録結果を記録します
    // event.getId()は登録された予定の一意のIDを返します
    Logger.log('登録完了: ' + title + ' / イベントID: ' + event.getId());
    successCount++;
  }

  // 【10】処理完了をアラートで通知します
  SpreadsheetApp.getUi().alert(
    '処理が完了しました。\n登録成功: ' + successCount + '件\nスキップ: ' + skipCount + '件'
  );
}
スクリプトエディタのコード画面

コードを貼り付けたら、Ctrl+S(MacはCmd+S)で保存します。ファイル名は「カレンダー登録」など分かりやすいものにしておくと後で管理しやすいです。

初回実行時は「このスクリプトへのアクセスを許可しますか?」という確認画面が表示されます。Googleアカウントの確認ダイアログで「詳細」→「(スクリプト名)(安全でない)に移動」→「許可」の順にクリックしてください。これは自分が作ったスクリプトを自分で実行するための通常の手順です。


スクリプトの実行方法

コードを保存したら、エディタ上部の「実行」ボタン(▷マーク)をクリックするだけです。

スプレッドシート側にボタンを設置してワンクリックで実行できるようにする方法もあります。

スプレッドシートにボタンを設置する場合は、「挿入」→「図形描画」でボタン形の図形を作り、右クリックで「スクリプトを割り当て」を選び、`registerToCalendar` を入力するだけです。

実行後、Googleカレンダーを開くと予定が一括登録されています。

Googleカレンダーに予定が一括登録された画面

よくあるエラーと対処法

コードを動かしていると、いくつかのエラーに遭遇することがあります。よくあるものをまとめました。

「カレンダーが見つかりません」というエラーが出た場合は、`calendarId` の値を確認してください。

エラー・症状原因対処法
「CalendarApp is not defined」スクリプトのCalendarApp APIへのアクセス権限未付与実行後の権限確認画面で「許可」をクリックする
「カレンダーが見つかりません」/ null参照エラーcalendarIdの指定ミス‘primary’のままにするか、カレンダー設定からIDを確認
日付が正しく読まれない / NaNエラーセルの書式がテキストになっている日時列を選択→「表示形式」→「数字」→「日時」に変更
権限エラー(You do not have permission)別アカウントのカレンダーへのアクセス対象カレンダーの所有者から共有設定を受ける
同じ予定が二重登録されるスクリプトを複数回実行した登録済フラグ列(F列)を追加して条件分岐を入れる
アラートが出ない・処理が止まる大量データで実行時間超過(6分制限)データを分割して複数回に分けて実行する

二重登録を防ぎたい場合は、F列に「登録済」フラグを追加する方法がおすすめです。カレンダー登録後に `sheet.getRange(i + 2, 6).setValue(‘登録済’)` を追記し、スクリプト冒頭でF列が空のものだけ処理するよう `if (row[5] === ‘登録済’) { skipCount++; continue; }` の条件分岐を入れると安全です。


サブカレンダーに登録したい場合

部署ごと、プロジェクトごとにカレンダーを分けている方も多いと思います。その場合は `calendarId` を変更するだけで対応できます。

カレンダーIDの調べ方は以下の通りです。

① Googleカレンダーを開く

② 左サイドバーで対象のカレンダーにカーソルを合わせ「︙」をクリック

③ 「設定と共有」をクリック

④ 「カレンダーの統合」セクションに「カレンダーID」が表示される

カレンダーIDは `xxxxx@group.calendar.google.com` という形式です。これをコード内の `calendarId` に貼り付けるだけで、指定のカレンダーに登録できます。


応用パターン①:繰り返し予定(毎週・毎月)への対応

GASの標準的な `createEvent` は単発の予定を登録します。毎週繰り返す予定を一括登録したい場合は、forループで日付をずらしながら複数回 `createEvent` を呼ぶ方法が確実です。


function registerWeeklyEvents() {
  var calendar = CalendarApp.getDefaultCalendar();
  
  // 毎週月曜日の「定例会議」を4週分登録する例
  var title = "週次定例会議";
  var startHour = 10; // 開始時刻(10時)
  var durationMinutes = 60; // 会議時間(60分)
  
  // 開始日(最初の月曜日)を設定します
  var startDate = new Date("2026-06-01T10:00:00"); // 最初の日付
  
  // 4週分(28日間)ループします
  for (var week = 0; week < 4; week++) {
    // startDateにweek * 7日を加算して翌週の日付を計算します
    var eventStart = new Date(startDate.getTime() + week * 7 * 24 * 60 * 60 * 1000);
    var eventEnd = new Date(eventStart.getTime() + durationMinutes * 60 * 1000);
    
    calendar.createEvent(title, eventStart, eventEnd);
    Logger.log('登録: ' + title + ' - ' + eventStart.toLocaleDateString());
  }
  
  SpreadsheetApp.getUi().alert('4週分の定例会議を登録しました。');
}

応用パターン②:予定の削除スクリプト

登録ミスや重複が起きた場合に備えて、特定の件名のカレンダー予定を一括削除するスクリプトも用意しておくと便利です。


function deleteCalendarEventsByTitle() {
  var calendar = CalendarApp.getDefaultCalendar();
  
  // 削除対象の件名を指定します(完全一致)
  var targetTitle = "月次定例会議"; // ← 削除したい件名に変更してください
  
  // 検索期間を指定します
  var startDate = new Date("2026-06-01");
  var endDate = new Date("2026-06-30");
  
  // 期間内のイベントを取得します
  var events = calendar.getEvents(startDate, endDate);
  var deleteCount = 0;
  
  for (var i = 0; i < events.length; i++) {
    // 件名が一致するイベントを削除します
    if (events[i].getTitle() === targetTitle) {
      events[i].deleteEvent();
      deleteCount++;
      Logger.log('削除: ' + events[i].getTitle());
    }
  }
  
  SpreadsheetApp.getUi().alert(deleteCount + '件の予定を削除しました。');
}

削除スクリプトは実行すると元に戻せません。実行前に対象の件名と期間を十分確認してください。また、削除したイベントはGoogleカレンダーのゴミ箱から30日以内であれば復元できます。


応用パターン③:複数カレンダーへの振り分け登録

スプレッドシートのF列にカレンダー名(または担当者名)を入れておき、その列の値によって別々のカレンダーに登録する方法です。部門ごとにカレンダーを使い分けているチームで役立ちます。


function registerToMultipleCalendars() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  
  // カレンダー名とカレンダーIDのマッピングを定義します
  // 各カレンダーのIDをGoogleカレンダーの設定から調べてください
  var calendarMap = {
    '営業部': 'eigyo@group.calendar.google.com',      // ← 実際のIDに変更
    '開発部': 'kaihatsu@group.calendar.google.com',   // ← 実際のIDに変更
    'primary': 'primary' // 指定なしの場合はメインカレンダーへ
  };
  
  var data = sheet.getRange(2, 1, lastRow - 1, 6).getValues(); // F列まで取得
  
  for (var i = 0; i < data.length; i++) {
    var title = data[i][0];
    var startTime = new Date(data[i][1]);
    var endTime = new Date(data[i][2]);
    var location = data[i][3] || '';
    var description = data[i][4] || '';
    var calendarName = data[i][5] || 'primary'; // F列のカレンダー名
    
    if (!title || isNaN(startTime.getTime())) continue;
    
    // カレンダー名に対応するIDを取得します
    var calendarId = calendarMap[calendarName] || 'primary';
    var calendar = CalendarApp.getCalendarById(calendarId);
    
    if (!calendar) {
      Logger.log('カレンダーが見つかりません: ' + calendarName);
      continue;
    }
    
    calendar.createEvent(title, startTime, endTime, {
      location: location,
      description: description
    });
    
    Logger.log('登録: ' + title + ' → ' + calendarName);
  }
  
  SpreadsheetApp.getUi().alert('複数カレンダーへの登録が完了しました。');
}

トリガーで毎月自動実行する設定手順

手動実行でも十分便利ですが、毎週月曜日に自動実行させることもできます。スクリプトエディタの左サイドバーにある「時計マーク(トリガー)」から設定します。

設定手順は以下の通りです。

① スクリプトエディタ左サイドバーの時計マーク(トリガー)をクリックする

② 右下の「トリガーを追加」ボタンをクリックする

③ 「実行する関数を選択」から `registerToCalendar` を選ぶ

④ 「イベントのソースを選択」から「時間主導型」を選ぶ

⑤ 「時間ベースのトリガーのタイプを選択」から「週ベースのタイマー」を選ぶ

⑥ 「曜日を選択」から「毎週月曜日」を選ぶ

⑦ 「時刻を選択」から「午前8時〜9時」などを選ぶ

⑧ 「保存」をクリックする

たとえば「毎週月曜の朝8時に実行」と設定しておけば、スプレッドシートに予定を書いておくだけで、月曜の朝にはカレンダーに反映されている状態になります。

スプレッドシートを更新するだけでカレンダーに反映される仕組みは、チームの予定管理・会議室予約・イベントスケジュールなど、あらゆる場面で使えます。

チームで共有のスプレッドシートを管理者が更新し、全員のカレンダーに反映させる運用にも応用できます。ただし、他メンバーのカレンダーに書き込む場合は、そのメンバーのGoogleアカウントでスクリプトを実行するか、対象カレンダーに編集権限を付与してもらう必要があります。

この記事のGASコードで実現できること:①スプレッドシートの予定をGoogleカレンダーへ一括自動登録、②場所・メモも同時に登録、③エラー行は自動スキップしてログに記録、④完了時に件数をアラートで通知、⑤繰り返し予定・複数カレンダー・削除にも対応。コピペするだけで今日から使えます。


スプレッドシート管理がそのままカレンダー管理になる

これまで「スプレッドシートに書いてからカレンダーにも入力する」という二重管理をしていた方は、このGASを導入することでその手間が丸ごとなくなります。

スプレッドシートに予定を書き込む→GASが自動でカレンダーに登録する、というフローを作ることで、入力は1回で完結します。

「まずは自分の業務で試してみたい」「もう少し複雑な条件を加えたい」「トリガーで自動実行させるところまでサポートしてほしい」という方は、ぜひLINEでご相談ください。

地道ラボでは、GASを使った業務自動化の無料相談をLINEで実施しています。

申し込みはLINEで「カレンダー自動化」とメッセージを送るだけです。

大げさなコンサルティングではなく、明日から試せる具体的な一歩をお伝えするのが私たちのスタイルです。

スプレッドシートとカレンダーの二重管理を終わらせる第一歩を、今日ここから踏み出しませんか。

次の一歩として、まずは「今どんな予定を手入力しているか」を一つ教えてください。その現状を、具体的に改善するプランをお伝えします。

AI活用や業務改善について、お困りごとはありませんか?

記事の内容に関するご質問や、自社への導入のご相談など、お気軽にお問い合わせください。

無料で相談する