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を参考にさせていただきました。
- スプレッドシートで管理している予定をGoogleカレンダーに一括登録する
- スプレッドシートで管理している予定をGoogleカレンダーに一括削除する
- 表に入力する項目は6つ (A列から順に)
- Subject:予定タイトルを入力する(必須入力)
- Start Date:開始日を入力する(必須入力)
- Start Time:予定の開始時刻を入力する(任意入力)
- End Time:予定の終了時刻を入力する(任意入力)
- location:場所を入力する(任意入力)
- Description:予定の詳細を入力する(任意入力)
- 実行方法
- 予定一括登録時:スプレッドシートの「メニューバー」に「一括登録」という実行ボタンを押下する
- 予定一括削除時:スプレッドシートの「メニューバー」に「一括削除」という実行ボタンを押下する。削除する場合は「予定が一括削除されます。削除してもよろしいですか?」というポップアップメッセージを表示する。「はい」を選択された場合に、スプレッドシート上に存在する予定を削除する。
最終的な要件定義
- 機能概要:
- Googleスプレッドシートのデータを用いて、個人のGoogleカレンダーに予定を一括登録・削除する。
- スプレッドシート構造:
- A列: Subject(予定タイトル、必須)
- B列: Start Date(開始日、必須、形式: YYYY/MM/DD)
- C列: Start Time(開始時刻、任意、24時間制)
- D列: End Time(終了時刻、任意、24時間制)
- E列: Location(場所、任意)
- F列: Description(詳細、任意)
- 実行方法:
- 一括登録: 「一括登録」ボタンをメニューバーに追加。
- 一括削除: 「一括削除」ボタンをメニューバーに追加。
- 一括削除条件:
- スプレッドシートの「A列: Subject」と「B列: Start Date」が一致する予定を削除。
- 重複登録防止:
- スプレッドシートの「A列: Subject」と「B列: Start Date」に基づき重複を判定。
- 重複する予定がカレンダーにある場合は登録しない。
- セキュリティ:
- 特定のGoogleアカウントに実行を限定。
- ユーザーインタフェース:
- 処理の進行状況を示すバーの表示。
- 完了メッセージ: 「予定の一括登録が完了しました。Googleカレンダーをご確認ください。」
- 削除確認ポップアップ:
- メッセージ: 「予定が一括削除されます。削除してもよろしいですか?」
- ユーザーは「はい」または「いいえ」を選択可能。
- 実行頻度:
- ボタン押下時のみ。
- エラーハンドリング:
プログラム上は特になし。 スプレッドシート上で、日付(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を使って業務効率化をするためのプログラムを作ったりできます。
最初はとっつきにくく感じたり、難しいと感じるかもしれませんが、多くの業務効率化をしたい場合は学んでみてはいかがでしょうか?
\ 効率的にプログラミング基礎を学ぶなら /