Googleカレンダーの内容をスプレッドシートに出力して集計する ~ChatGPTでコードを書いてもらう
最初に集計した結果から
プライベート等は、飛行機や新幹線の時間もいれてたり、終日で登録していることも多いので、総作業時間はの数字は適当なものです。
他の項目はその時間に合わせて入れているので正確かなと思います。
Googleカレンダー
Googleカレンダーでは以下のように分類して入れています。1年も終わりなので、作業時間を集計したいなと思います。Consultはお金をもらって相談している時間です。Studyは勉強会などの時間です。セミナはそのままですがセミナを実施している時間です。窓口は公的機関などに一日座って対応している時間です。打ち合わせは、ノーチャージの単なる打ち合わせ時間です。
集計はしませんが、Undesideは仮の予定を入れています。 村上知也の項目はプライベートの他、新幹線や飛行機の時間をいれています。
ChatGPTでコードを書いてもらいました
以下のようにプロンプトでお願いして、GASのコードを書いてもらいました。
・GoogleカレンダーからGoogleスプレッドシートに出力するGASのコードを書いてください
→そのまま出力するようにお願いしました。
・複数のカレンダーIDを一括で出力できるように変更して
→Googleカレンダーでは複数のカレンダーに分けて入力しているので、一括で出力できるようにしました
・終了日時から開始日時を引いた作業時間の項目を追加してください
→作業時間を集計したかったので、分数を出力してもらいました
・開始日と終了日を入力できるようにしてください
→最初に、いつからいつまでかを入力するようにしました
・場所と説明を削除してください
→場所や説明は今回のシートに不要なため、削除しました
・最後にカレンダIDごとに件数と分数を集計してください
集計結果を シート2 に出力する
→別シートに集計結果を一括でだしてもらいました
もちろん、一括でプロンプトをまとめて指示しちゃった方が手っ取り早いです。
出力されたコード
カレンダーIDのところ(青線)を自分のカレンダーIDに変更してください。
Googleカレンダーの各項目の設定のところに、カレンダーIDが載っています。
コーディングしているイラストを頼むと、たいてい背中側に掲載されますよね
実際に出力されたプログラム
function exportAndSummarizeCalendarsToMultipleSheets() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = spreadsheet.getSheetByName('シート1') || spreadsheet.insertSheet('シート1');
const sheet2 = spreadsheet.getSheetByName('シート2') || spreadsheet.insertSheet('シート2');
// カレンダーIDを配列で指定
const calendarIds = [
'primary', // メインカレンダー
'example1@gmail.com', // 他のカレンダーID
'example2@gmail.com'
];
// ユーザーに開始日と終了日を入力させる
const startDateInput = Browser.inputBox('開始日を入力してください(例: 2024-12-01)');
const endDateInput = Browser.inputBox('終了日を入力してください(例: 2024-12-31)');
// 入力された日付をDateオブジェクトに変換
const startDate = new Date(startDateInput);
const endDate = new Date(endDateInput);
// 日付が正しく入力されたか確認
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
Browser.msgBox('日付の形式が正しくありません。再度実行して正しい形式で入力してください。');
return;
}
// シート1とシート2をクリア
sheet1.clear();
sheet2.clear();
// シート1のヘッダー行を作成
sheet1.appendRow(['カレンダー名', 'タイトル', '開始日時', '終了日時', '作業時間 (分)']);
// 集計データを格納するオブジェクト
const summary = {};
// 各カレンダーのイベントを取得して出力
calendarIds.forEach(calendarId => {
const calendar = CalendarApp.getCalendarById(calendarId);
if (!calendar) {
Logger.log(`カレンダーが見つかりません: ${calendarId}`);
return;
}
const events = calendar.getEvents(startDate, endDate);
const calendarName = calendar.getName();
// 初期化
if (!summary[calendarName]) {
summary[calendarName] = { count: 0, totalMinutes: 0 };
}
events.forEach(event => {
const title = event.getTitle();
const startTime = event.getStartTime();
const endTime = event.getEndTime();
// 作業時間を計算(ミリ秒から分に変換)
const durationInMinutes = (endTime - startTime) / (1000 * 60);
// 集計
summary[calendarName].count++;
summary[calendarName].totalMinutes += durationInMinutes;
// シート1にイベントを出力
sheet1.appendRow([calendarName, title, startTime, endTime, durationInMinutes]);
});
});
// シート2のヘッダー行を作成
sheet2.appendRow(['カレンダー名', '件数', '総作業時間 (分)']);
// 集計結果をシート2に出力
for (const [calendarName, data] of Object.entries(summary)) {
sheet2.appendRow([calendarName, data.count, data.totalMinutes]);
}
SpreadsheetApp.flush();
Logger.log(`複数カレンダーのイベントを「シート1」に出力し、集計結果を「シート2」に出力しました。`);
}
コードの実行環境
Googleでスプレッドシートを開いて、拡張機能から Apps Scriptを開いて貼り付けるだけです。
シート1は最初からあると思いますが、シート2は追加しておきます
コードを保存して実行します
実行すると、スプレッドシート側で開始日、終了日の入力が求められます。
出力された結果
シート1
カレンダーごとに作業時間を出力しています
集計結果
冒頭同じですが、最終サマリ結果。 D列の時間は、もう面倒なので、最後に60分で割っただけです。ヘッダの色も自分でつけました
実行時間
546件のカレンダー項目に対して、3分34秒かかりました
追記
時間換算と、ヘッダに色を付けるところまで含めました。コード修正してもらいました。以下に修正したコードをテキストファイルで置いておきます。
“Googleカレンダー集計スクリプト” をダウンロード Googleカレンダー集計スクリプト.txt – 14 回のダウンロード – 3.31 KBそんなところで