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を使ってブラッシュアップした最終的な要件定義
- 機能概要:
- 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カレンダーをご確認ください。」
- 削除確認ポップアップ:
- メッセージ: 「予定が一括削除されます。削除してもよろしいですか?」
- ユーザーは「はい」または「いいえ」を選択可能。
- 実行頻度:
- エラーハンドリング:プログラム上は特になし。 スプレッドシート上で、日付(B列: Start Date)の箇所へ入力規則を設定することでエラー防止することにした
GASのコードとスプレッドシートテンプレート
要件が整理できたらchatGPTを使ってプログラムを作成していきます。
プログラムのベースとなるコードはけいすけ様のnoteのように、要件に基づいてchatGPTに作成してもらいます。
一発で自分の理想のプログラムにならないことがほとんどなので、その後は必要に応じてchatを分け、機能ごとに調整していきました。
プログラムの機能ごとに自分の要件に合うように、トライアンドエラーを繰り返します
※このときプログラミングの基礎が少しわかると、どこを調整すればよいかアタリがつけやすくなります。プログラミングの基礎を学習するには書籍や、Udemyのようなオンライン講座を活用すると良いでしょう。
スプレッドシートテンプレート
今回は、イーディーエル株式会社さまの記事を参考に、以下のようなテンプレートを作成してみました。
スプレッドシートテンプレート(コピーして使用してください)https://docs.google.com/spreadsheets/d/10otZJwPAn2327ntA35zSvBn7UsAG2ZoUWQvEKPdbrbg/copy?usp=sharing
GASプログラミングコード
今回作成したGASのコードは以下です。
※個人利用や業務の効率化のために自由にコピー&アレンジしてご使用いただけますが、コードの使用は自己責任でお願いします。
ガバガバなところがあったらすみません…
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 {
endDateTime = new Date(startDateTime.getTime() + 60 * 60 * 1000);
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カレンダーをご確認ください。');
}
function bulkDeleteEvents() {
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() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('カレンダー操作')
.addItem('予定一括登録', 'bulkAddEvents')
.addItem('予定一括削除', 'bulkDeleteEvents')
.addToUi();
}
まとめ
今回はGoogle Apps Script(通称GAS)を活用して、スプレッドシートに入力した予定をGoogle カレンダーに一括で登録する方法をご紹介しました。
スプレッドシートからGoogleカレンダーに予定を一括登録できるようになると、ちょっと時短になりますね!
プログラミングの基礎知識があれば、今回紹介したプログラムをアレンジしたり、chatGPTなどの生成AIを使って業務効率化をするためのプログラムを作ったりできます。
最初はとっつきにくく感じたり、難しいと感じるかもしれませんが、多くの業務効率化をしたい場合は学んでみてはいかがでしょうか?