【GAS】スプレッドシートからGoogleカレンダーに予定を一括登録してみた

当ページのリンクにはプロモーションが含まれています。

Googleカレンダーユーザーのみなさん! こんにちは、まなてぃです。

シフト勤務や、不定期な予定が多く発生する方々にとって、Google カレンダーへの予定登録は、時に手間がかかる作業ですよね。特に似たような予定で、タイトルの一部を分けたい場合や、勤務時間が変わる場合、カレンダーに一つずつ手動で入力するのは面倒です。

そこで、今回はGoogle Apps Script(通称GAS)を活用して、スプレッドシートに入力した予定をGoogle カレンダーに一括で登録する方法をご紹介します。この方法なら、複雑なシフトや定期的な予定も、スプレッドシートからボタン一つで簡単にカレンダーに追加できます。

このプログラムを作成するにあたって、chatGPT Plus(GPT4)を使用しました。本ブログに記載されているコードは、個人利用や業務の効率化のために自由にコピー&アレンジしてご使用いただけます。ただし、コードの使用は自己責任でお願いします。プログラムは私個人のニーズに合わせて作成していますので、ご理解の上、ご利用ください。

こんな方に読んでほしい
  • 予定の管理に Google カレンダーを使っている人
  • バイトやパート、仕事の予定など変則的な予定が発生する人
  • 毎月のシフトを一括で登録したり、毎月の勤務予定をまとめて登録したりしたい人

(スポンサーリンク)

目次

参考にさせていただいた文献

劇的に時短! Google カレンダーの予定一括登録とは?【テンプレ付き】

https://www.edl.co.jp/google-calendar/diamond-150/ イーディーエル株式会社

スプレッドシートで予定を管理する際の、テンプレートについて参考にさせていただきました。
ありがとうございます。

Google Apps Script 開発のための ChatGPT プロンプト

けいすけ @keisuke_edu #note https://note.com/tyaperujp01/n/n95f58236fcf0?sub_rt=share_h

ChatGPTのプロンプトを参考にさせていただきました。ありがとうございます。

プログラム作成前にざっくり作ったプログラムの要件

プログラムを作成する前に、どんなプログラムを作るか考えます。

今回は以下のようにしてみました。以下の内容をchatGPTを使ってブラッシュアップしていきます。
プロンプトは、けいすけ様のnoteを参考にさせていただきました。

chatGPT利用前の要件
  • スプレッドシートで管理している予定をGoogleカレンダーに一括登録する
  • スプレッドシートで管理している予定をGoogleカレンダーに一括削除する
  • 表に入力する項目は6つ (A列から順に)
    • Subject:予定タイトルを入力する(必須入力)
    • Start Date:開始日を入力する(必須入力)
    • Start Time:予定の開始時刻を入力する(任意入力)
    • End Time:予定の終了時刻を入力する(任意入力)
    • location:場所を入力する(任意入力)
    • Description:予定の詳細を入力する(任意入力)
  • 実行方法
    • 予定一括登録時:スプレッドシートの「メニューバー」に「一括登録」という実行ボタンを押下する
    • 予定一括削除時:スプレッドシートの「メニューバー」に「一括削除」という実行ボタンを押下する。削除する場合は「予定が一括削除されます。削除してもよろしいですか?」というポップアップメッセージを表示する。「はい」を選択された場合に、スプレッドシート上に存在する予定を削除する。
chatGPTを使ってブラッシュアップした要件

最終的な要件定義

  1. 機能概要:
    • Googleスプレッドシートのデータを用いて、個人のGoogleカレンダーに予定を一括登録・削除する。
  2. スプレッドシート構造:
    • A列: Subject(予定タイトル、必須)
    • B列: Start Date(開始日、必須、形式: YYYY/MM/DD)
    • C列: Start Time(開始時刻、任意、24時間制)
    • D列: End Time(終了時刻、任意、24時間制)
    • E列: Location(場所、任意)
    • F列: Description(詳細、任意)
  3. 実行方法:
    • 一括登録: 「一括登録」ボタンをメニューバーに追加。
    • 一括削除: 「一括削除」ボタンをメニューバーに追加。
  4. 一括削除条件:
    • スプレッドシートの「A列: Subject」と「B列: Start Date」が一致する予定を削除。
  5. 重複登録防止:
    • スプレッドシートの「A列: Subject」と「B列: Start Date」に基づき重複を判定。
    • 重複する予定がカレンダーにある場合は登録しない。
  6. セキュリティ:
    • 特定のGoogleアカウントに実行を限定。
  7. ユーザーインタフェース:
    • 処理の進行状況を示すバーの表示。
    • 完了メッセージ: 「予定の一括登録が完了しました。Googleカレンダーをご確認ください。」
  8. 削除確認ポップアップ:
    • メッセージ: 「予定が一括削除されます。削除してもよろしいですか?」
    • ユーザーは「はい」または「いいえ」を選択可能。
  9. 実行頻度:
    • ボタン押下時のみ。
  10. エラーハンドリング:
    プログラム上は特になし。 スプレッドシート上で、日付(B列: Start Date)の箇所へ入力規則を設定することでエラー防止することにした

GASのコードとスプレッドシートテンプレート

要件が整理できたらchatGPTを使ってプログラムを作成していきます。

プログラムのベースとなるコードはけいすけ様のnoteのように、要件に基づいてchatGPTに作成してもらいます。一発で自分の理想のプログラムにならないことがほとんどなので、その後は必要に応じてchatを分け、機能ごとに調整していきました。
プログラムの機能ごとに自分の要件に合うように、トライアンドエラーを繰り返します。
※このときプログラミングの基礎が少しわかると、どこを調整すればよいかアタリがつけやすくなります。プログラミングの基礎を学習するには書籍や、Udemyのようなオンライン講座を活用すると良いでしょう

効率的にプログラミング基礎を学ぶなら

スプレッドシートテンプレート

今回は、イーディーエル株式会社さまの記事を参考に、以下のようなテンプレートを作成してみました。

スプレッドシートテンプレート(コピーして使用してください)
https://docs.google.com/spreadsheets/d/10otZJwPAn2327ntA35zSvBn7UsAG2ZoUWQvEKPdbrbg/edit?usp=sharing

GASプログラミングコード

今回作成したGASのコードは以下です。

※個人利用や業務の効率化のために自由にコピー&アレンジしてご使用いただけますが、コードの使用は自己責任でお願いします。ガバガバなところがあったらすみません…

/**
 * スプレッドシートのデータを元にGoogleカレンダーから予定を一括登録する
 */
function bulkAddEvents() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // スプレッドシートのデータ範囲を取得
  const dataRange = sheet.getDataRange();
  // データ範囲の全行を取得
  const rows = dataRange.getValues();
  // デフォルトのカレンダーを取得
  const calendar = CalendarApp.getDefaultCalendar();

  // 各行に対してループ処理
  for (let i = 1; i < rows.length; i++) {
    // 行のデータを個別の変数に展開
    const [subject, startDate, startTime, endTime, location, description] = rows[i];
    // 件名が空の場合はスキップ
    if (!subject) {
      Logger.log('行 ' + (i + 1) + ': 件名が空です。スキップします。');
      continue;
    }

    // 開始時間と終了時間が両方空欄の場合は終日イベントとして登録
    if (!startTime && !endTime) {
      Logger.log('行 ' + (i + 1) + ': 終日イベントとして登録します。');
      calendar.createAllDayEvent(subject, new Date(startDate), {location, description});
    } else {
      // 通常のイベントとして登録
      let startDateTime = new Date(startDate);
      let endDateTime = new Date(startDate);

      // 開始時間がある場合は設定
      if (startTime) {
        startDateTime.setHours(startTime.getHours(), startTime.getMinutes());
      }

      // 終了時間がある場合は設定
      if (endTime) {
        endDateTime.setHours(endTime.getHours(), endTime.getMinutes());
      } else {
        // 終了時間がない場合、開始時間から1時間後を終了時間とする
        endDateTime = new Date(startDateTime.getTime() + 60 * 60 * 1000); // 1時間をミリ秒で追加
        Logger.log('行 ' + (i + 1) + ': 終了時間が設定されていないので、開始時間から1時間後を設定します。');
      }

      // 既存のイベントと重複していないかチェック
      const events = calendar.getEvents(startDateTime, endDateTime);
      const isDuplicate = events.some(event => event.getTitle() === subject && event.getStartTime().getTime() === startDateTime.getTime());

      // 重複がなければイベントを作成
      if (!isDuplicate) {
        Logger.log('行 ' + (i + 1) + ': イベントを作成します。');
        calendar.createEvent(subject, startDateTime, endDateTime, {location, description});
      } else {
        // 重複するイベントがあればスキップ
        Logger.log('行 ' + (i + 1) + ': 重複するイベントが存在します。スキップします。');
      }
    }
  }

  // 一括登録完了のアラートを表示
  SpreadsheetApp.getUi().alert('予定の一括登録が完了しました。Googleカレンダーをご確認ください。');
}



/**
 * スプレッドシートのデータを元にGoogleカレンダーから予定を一括削除する
 */
function bulkDeleteEvents() {
  // スプレッドシートのUIを取得
  const ui = SpreadsheetApp.getUi();
  // 削除前に確認ダイアログを表示
  const response = ui.alert('予定が一括削除されます。削除してもよろしいですか?', ui.ButtonSet.YES_NO);

  // 「はい」が選択された場合に処理を実行
  if (response === ui.Button.YES) {
    // アクティブなスプレッドシートとそのデータ範囲を取得
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    const rows = sheet.getDataRange().getValues();
    // デフォルトのカレンダーを取得
    const calendar = CalendarApp.getDefaultCalendar();

    // 各行に対してループ処理
    rows.forEach((row, index) => {
      if (index === 0) return; // ヘッダー行はスキップ

      // 行のデータを個別の変数に展開
      const [subject, startDate] = row;
      // 件名または開始日が空の場合はスキップ
      if (!subject || !startDate) return;

      // 指定された日付のイベントを取得
      const events = calendar.getEventsForDay(new Date(startDate));
      // 該当するイベントを削除
      events.forEach(event => {
        if (event.getTitle() === subject) {
          event.deleteEvent();
        }
      });
    });

    // 一括削除完了のアラートを表示
    ui.alert('予定の一括削除が完了しました。');
  }
}


/**
 * スプレッドシートのメニューバーにカスタムメニューを追加する
 */
function onOpen() {
  // スプレッドシートのUIを取得
  const ui = SpreadsheetApp.getUi();
  // 新しいメニューを作成
  ui.createMenu('カレンダー操作')
    // メニューに「予定一括登録」という項目を追加。クリックするとbulkAddEvents関数が実行される
    .addItem('予定一括登録', 'bulkAddEvents')
    // メニューに「予定一括削除」という項目を追加。クリックするとbulkDeleteEvents関数が実行される
    .addItem('予定一括削除', 'bulkDeleteEvents')
    // 作成したメニューをUIに追加
    .addToUi();
}

ゆる~い使い方イメージ

まとめ

今回はGoogle Apps Script(通称GAS)を活用して、スプレッドシートに入力した予定をGoogle カレンダーに一括で登録する方法をご紹介しました。スプレッドシートからGoogleカレンダーに予定を一括登録できるようになると、ちょっと時短になりますね!

プログラミングの基礎知識があれば、今回紹介したプログラムをアレンジしたり、chatGPTなどの生成AIを使って業務効率化をするためのプログラムを作ったりできます。

最初はとっつきにくく感じたり、難しいと感じるかもしれませんが、多くの業務効率化をしたい場合は学んでみてはいかがでしょうか?

効率的にプログラミング基礎を学ぶなら

(スポンサーリンク)

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

この記事を書いた人

訪問いただきありがとうございます。
まなてぃと申します。
元IT企業の人→フリーランス→派遣OL&主婦。ブログを書いています。最近はデータ集計や分析のお仕事をしています。
このブログでは、主婦(主夫)さんに向けた、ライフスタイルに関すること、自身のスキルアップのことなど、ざっくばらんに発信できればいいなと思っています。よろしければご覧ください。

目次