「スプレッドシートの予定を、毎回カレンダーに手入力するのが面倒…」そんな悩みを解決します。この記事では、生成AIを使ってGoogle Apps Script(GAS)のコードを作成し、スプレッドシートからGoogleカレンダーへワンクリックで予定を一括登録・更新・削除する仕組みの作り方を、初心者にも分かりやすく解説。コピペで使えるコードとテンプレート付きです。

プログラミング初心者の方でも大丈夫!今回は、話題の生成AIGASコードを作成してもらう方法も交えながら、誰でも簡単に実装できるように解説していきます。

※私はGemini PROを利用して作成しております。

この記事を読めば、こんな未来が手に入ります
  • メリット1:スプレッドシートに記載した複数の予定を、ワンクリックでGoogleカレンダーに一括登録できます。
  • メリット2:GASの基本的な使い方を学ぶことができます。
  • メリット3:生成AIにGASを作ってもらった時のエラー修正や、追加機能の提案ができるようになります。

カレンダーに予定一括登録シートの配布

カレンダーに予定一括登録シートの配布

シートを丸ごと配布

シートをコピーすれば、面倒なスプレットシートとGoogle Apps Script(GAS)の連携は不要で利用することができます。

▼ 初回利用時のスクリプト承認手続きについてはこちら

GASコードのみ利用する

/**
 * スプレッドシートを開いたときにカスタムメニューを追加する関数
 */
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('カレンダー連携')
    .addItem('予定をカレンダーに登録・更新・削除', 'syncCalendar')
    .addToUi();
}

/**
 * 日本語の色名をCalendarAppの定数に変換するヘルパー関数
 */
function mapColorNameToEventColor(colorName) {
  const colorMap = {
    '青': CalendarApp.EventColor.BLUE, '青緑': CalendarApp.EventColor.CYAN,
    '灰色': CalendarApp.EventColor.GRAY, '緑': CalendarApp.EventColor.GREEN,
    '藤色': CalendarApp.EventColor.MAUVE, 'オレンジ': CalendarApp.EventColor.ORANGE,
    '水色': CalendarApp.EventColor.PALE_BLUE, '薄い緑': CalendarApp.EventColor.PALE_GREEN,
    '薄い赤': CalendarApp.EventColor.PALE_RED, '赤': CalendarApp.EventColor.RED,
    '黄': CalendarApp.EventColor.YELLOW
  };
  return colorMap[colorName] || null;
}

/**
 * スプレッドシートの情報をGoogleカレンダーに同期(登録・更新・削除)するメイン関数
 */
function syncCalendar() {
  const ui = SpreadsheetApp.getUi();
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('カレンダー登録');
  if (!sheet) {
    ui.alert('「カレンダー登録」シートが見つかりません。');
    return;
  }

  const calendarId = sheet.getRange('B1').getValue();
  if (!calendarId) {
    ui.alert('B1セルにカレンダーIDを入力してください。');
    return;
  }

  let calendar;
  try {
    calendar = CalendarApp.getCalendarById(calendarId);
  } catch (e) {
    ui.alert('指定されたカレンダーIDが無効か、アクセス権がありません。');
    return;
  }

  const lastRow = sheet.getLastRow();
  if (lastRow < 4) {
    ui.alert('データがありません。');
    return;
  }

  const dataRange = sheet.getRange('A4:I' + lastRow);
  const data = dataRange.getValues();

  for (let i = data.length - 1; i >= 0; i--) {
    const row = data[i];
    const eventId = row[7];
    const shouldDelete = row[8];

    if (shouldDelete === true && eventId) {
      try {
        const event = calendar.getEventById(eventId);
        if (event) {
          event.deleteEvent();
        }
        sheet.getRange(i + 4, 1, 1, 9).clearContent();
      } catch (e) {
        sheet.getRange(i + 4, 6).setValue('削除エラー: ' + e.message);
      }
    }
  }

  const updatedDataRange = sheet.getRange('A4:I' + sheet.getLastRow());
  const updatedData = updatedDataRange.getValues();

  for (let i = 0; i < updatedData.length; i++) {
    const row = updatedData[i];
    const title = row[0];
    const startTime = row[1];
    const endTime = row[2];
    const description = row[3];
    const location = row[4];
    const colorName = row[6];
    const eventId = row[7];
    const shouldDelete = row[8];

    if (!title || !startTime || !endTime || shouldDelete === true) {
      continue;
    }

    try {
      const startDate = new Date(startTime);
      const endDate = new Date(endTime);
      if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
        throw new Error('日時の形式が不正です');
      }

      let event;
      if (eventId) {
        try {
          event = calendar.getEventById(eventId);
        } catch (e) {
          event = null; 
        }

        if (event) {
          event.setTitle(title);
          event.setTime(startDate, endDate);
          event.setDescription(description);
          event.setLocation(location);
          const eventColor = mapColorNameToEventColor(colorName);
          if (eventColor) event.setColor(eventColor);
          sheet.getRange(i + 4, 6).setValue('更新済み');
        } else {
             const newEvent = calendar.createEvent(title, startDate, endDate, {
                description: description,
                location: location
            });
            const newEventId = newEvent.getId();
            sheet.getRange(i + 4, 8).setValue(newEventId);
            if (mapColorNameToEventColor(colorName)) newEvent.setColor(mapColorNameToEventColor(colorName));
            sheet.getRange(i + 4, 6).setValue('再登録済み');
        }

      } else {
        const existingEvents = calendar.getEvents(startDate, endDate, { search: title });
        if (existingEvents.length > 0) {
           sheet.getRange(i + 4, 6).setValue('登録済み(重複)');
           continue;
        }

        const newEvent = calendar.createEvent(title, startDate, endDate, {
          description: description,
          location: location
        });
        const newEventId = newEvent.getId();
        sheet.getRange(i + 4, 8).setValue(newEventId);

        const eventColor = mapColorNameToEventColor(colorName);
        if (eventColor) newEvent.setColor(eventColor);

        sheet.getRange(i + 4, 6).setValue('登録済み');
      }
    } catch (e) {
      sheet.getRange(i + 4, 6).setValue('エラー: ' + e.message);
    }
  }
  
  ui.alert('カレンダーとの同期処理が完了しました。');
}

そもそもGAS(Google Apps Script)って何?

GASは、Googleが開発したプログラミング言語です。「Googleの様々なサービス(Gmail、スプレッドシート、ドキュメントなど)を自動化・連携が得意なプログラムのことです。GASを生成AIに書いてもらうことができる現在は、アイディアさへあればプログラミングに詳しくなくても、様々な自動化を自分で作ることができます!

もちろんプログラミング知識があればもっと複雑なこともデバックする作業も大幅に削減できるので、これを気にプログラミングの基礎も学ぶこともおすすめします。

GASのベースとなっているJavaScriptは情報も多く、プログラミング初心者でも学びやすい言語です。

関連記事
Google Workspace自動化入門!GAS(JavaScript)プログラミング初心者のための4ステップ学習法

「AIがコードを書く時代、プログラミングは不要?」そう考えていませんか?実は、AIを真に使いこなすにはプログラミングの基礎知識が不可欠です。この記事では、プログラミングに何度も挫折した筆者が、JavaScriptの基礎を固め、GASで自在に業務を自動化できるようになった具体的な4ステップの学習法を全公開します。

【カレンダーに予定一括登録シート】作成方法

プログラミング知識に自信がない人は、テンプレートとGASをセットで作ってもらうことをおすすめします。現時点で記載があるシートのメーリングリストを利用することもできますが、セルにキレイに1名ずつメールアドレスが記載されているとは限らないし、AIに上手くセルの状況を伝えることができないと失敗する可能性が高くなるためです。

スプレットシートからがレンダーに登録できるGASとシートのテンプレート作って
カレンダーIDはシートに記載できるようにして

生成AI(Gemini)がスプレットシートのテンプレートまで作成してくれてるので、【Googleスプレットシートにエクスポート】ボタンを押します。

A列、1行~はいらないので消去して、各タイトルを上に移動します。

下記のコードをコピーして【Apps Script】に記載します。

GASコードを【Apps Script】に設定する手順

1
スプレッドシートのメニュー「拡張機能」>「Apps Script」を開きます。

2
表示されている古いコードをすべて削除し、GASコードをコピペします。

3
登録したいカレンダーIDを調べます。

マイカレンダー【⋮】→【設定と共有】→下の方へスクロール【カレンダーID】をコピー
特定のカレンダーを追加してない場合は自分のメールアドレスがカレンダーIDになります。

4
カレンダー情報の記載してある【シート名】とGASコードの【getSheetByName(‘シート名’);】が一緒か確認して、保存(💾アイコン:※Ctrl(macはCommand)+Sでも保存可能)してください。

5
スプレッドシートを再読み込みするか、再度開き直してください。上部メニューに「カレンダー連携」というカスタムメニューが表示されます。

6
「カレンダー連携」>「予定をカレンダーに登録」をクリックします。

初回実行時の承認

  • 初めて実行する際に「承認が必要です」というダイアログが表示されます。「続行」をクリックしてください。
  • 自分のGoogleアカウントを選択します。
  • 「このアプリは Google で確認されていません」という警告画面が表示される場合がありますが、これは自作のスクリプトのためです。左下の「詳細」をクリックし、「(プロジェクト名)(安全ではないページ)に移動」をクリックして次に進んでください。
  • 「メールの送信」などを許可する画面が表示されるので、「許可」をクリックします。

承認が完了すると、スクリプトが実行されます。

「カレンダー予定に色を設定できる」機能を追加する

ここまででも充分使えますが、カレンダーの色を指定できると見分けるのに便利なので、スプレットシートの時点で予定の色を設定できるように生成AIに修正してもらうことにしました。

カレンダの予定に色を設定できるようにして

スプレットシートの修正

生成AIがスプレットシートのテンプレとGASコードを修正してくれたのでそれを先程のシートに上書きしていきます。

色入力しやすいようにプルダウンに登録しておきます。

GASの修正

GASコードを上書きして実行したところ、なんとエラーが発生

エラーが発生した時の対処法

GASを入力したApps Scriptの左のメニューから【実行数】をクリックすると右側に「失敗しました」とエラーのログが残っているので、こちらをクリックすると下記のようなエラーの理由が書かれているのでこの文章そのままコピーして、生成AIにエラーが出たことを報告します。

修正してもらったコードを上書きし保存して、なんとか作成できました。

生成AIに更に機能を提案してもらう

ここまででも充分なのですが、自分でも思いつかないアイディアを生成AIに提案してもらいます。更に良いものが作れるかもしれないし、自分の勉強にもなるので、利用するかはおき、よく安打ししてもらいます。

他に追加したほうが良い機能があればおしえて
追加して

更新機能: スプレッドシート側で登録済みの予定の日時や件名を変更してスクリプトを再実行すると、カレンダーの予定も自動で更新される機能。

削除機能: シートに「削除」列を作り、そこに「はい」と入力して実行すると、対応するカレンダーの予定が削除される機能。

追加してもらった機能を更に上書きして、シートのデザインや入力規則を整えて完成!お疲れ様でした!今回は、エラーの修正の仕方や、機能追加、生成AIに更にアイディアを出してもらい更に追加する方法をまとめてみました。生成AIをつかったリアルな制作レポートは以上となります!

完成版のシートは上の方で配布しているので、シートだけ利用したい方はコピーしてご利用ください。