GASで、複数日のイベントをその、日数分表示したい。表示したら、同じ日付と、同じ名前の行を一つにまとめたいです。

実現したいこと

Googleカレンダーからイベントを取得して、同じ人同じ日付があったとき、スプレッドシートに表示する時に、そのイベントを一つにまとめたいです。
一つにまとめるところまで行けましたが、Googleカレンダーで複数日のイベントがあったとき、例えば、2/1~2/7までの予定をいれたとき、スプレッドシートの表示結果ではその日付の開始日の一行しか表示されません。複数日のイベントを一行ずつ表示することまではできたのですが、チャットGPTにまとめてと指示をだすと、最初の複数日のイベントの最初の開始日(2/1)と一日だけのイベントがまとめて表示されます。次の複数日のイベントの翌日2/2を一行として表示したいのですが、開始日しか表示されません。
どうにかGoogleカレンダーの表示に似たような形でスプレッドシートにも反映したいです。イメージ説明

イメージ説明

発生している問題・分からないこと

chat.gptでコードを生成しているので、GASに関しての知識は皆無です。
画像のような表示ができたらいいなと思っています。
お手数ですがご回答いただけるかたいらっしゃらないでしょうか?
よろしくお願いいたします。
なにか必要な情報等あればおっしゃっていただけると助かります。

該当のソースコード

function getEvents() { var mySheet = SpreadsheetApp.getActiveSheet(); // シートを取得 // 既存のデータをクリアする(表示される範囲のみ) mySheet.getRange(2, 2, mySheet.getLastRow() - 1, 4).clear(); var no = 1; // No // 今日の日付を取得 var today = new Date(); today.setHours(0, 0, 0, 0); // 00:00:00に設定 // 先週の月曜日の日付を取得 var startDate = new Date(today); startDate.setDate(today.getDate() - today.getDay() + (today.getDay() === 0 ? -6 : 1) - 7); // 先週の月曜日 // 4週間後の日付を取得 var endDate = new Date(startDate); endDate.setDate(startDate.getDate() + 27); // 4週間後 // アカウントに紐付けられているすべてのカレンダーを取得 var calendars = CalendarApp.getAllCalendars(); // イベントデータを保持するオブジェクト var eventsData = {}; for (var i in calendars) { // 対象オブジェクト毎の指定期間内の予定を取得 var myEvents = calendars[i].getEvents(startDate, endDate); // カレンダー毎のイベントを繰り返し最終行に追加 for (var j in myEvents) { var evt = myEvents[j]; // 開始時刻と終了時刻が "00:00:00" かどうかを確認 if ( evt.isAllDayEvent() || (evt.getStartTime().getHours() == 0 && evt.getStartTime().getMinutes() == 0 && evt.getStartTime().getSeconds() == 0 && evt.getEndTime().getHours() == 0 && evt.getEndTime().getMinutes() == 0 && evt.getEndTime().getSeconds() == 0) ) { // イベントのキーとして日付と名前の組み合わせを使用 var key = evt.getStartTime().toDateString() + calendars[i].getName(); if (!eventsData[key]) { eventsData[key] = { no: no, name: calendars[i].getName(), startDate: evt.getStartTime(), location: evt.getLocation(), creator: evt.getCreators()[0], titles: [evt.getTitle()] }; no++; } else { eventsData[key].titles.push(evt.getTitle()); } } } } // イベントデータをシートに書き込む var startRow = 2; // 2行目から開始する for (var key in eventsData) { var eventData = eventsData[key]; var range = mySheet.getRange(startRow, 2, 1, 4); // B列から書き込むように修正(4は書き込む列数を表します) range.setValues([[ eventData.startDate, eventData.name, eventData.titles.join('\n'), // イベントタイトルを改行して結合 eventData.location ]]); startRow++; } }
function getEvents() { var mySheet = SpreadsheetApp.getActiveSheet(); // シートを取得 var no = 1; // No // 期間を指定する var startDate = new Date('2024/02/01 00:00:00'); // 取得開始日 var endDate = new Date('2024/02/15 00:00:00'); // 取得終了日 // アカウントに紐付けられているすべてのカレンダーを取得 var calendars = CalendarApp.getAllCalendars(); for (var i = 0; i < calendars.length; i++) { // 対象オブジェクト毎の指定期間内の予定を取得 var myEvents = calendars[i].getEvents(startDate, endDate); for (var j = 0; j < myEvents.length; j++) { var event = myEvents[j]; var isAllDay = event.isAllDayEvent(); var startTime = event.getStartTime(); var endTime = event.getEndTime(); var eventDuration = (endTime.getTime() - startTime.getTime()) / (1000 * 60 * 60 * 24); // イベントの日数 // 終日イベントと複数日の終日イベント以外のイベントは表示しない if (!(isAllDay && (eventDuration === 1 || eventDuration > 1))) { continue; } // 複数日のイベントを1日1日に分けて表示 if (eventDuration > 1) { var eventTitle = event.getTitle(); var eventStartDate = new Date(startTime); // イベントの日数分、行を追加して各日の情報を表示 for (var k = 0; k < eventDuration; k++) { var eventEndDate = new Date(eventStartDate); eventEndDate.setDate(eventEndDate.getDate() + 1); mySheet.appendRow([ no, // No calendars[i].getName(), eventTitle, // イベントタイトル "複数日の終日イベント", // イベントタイプ eventStartDate.toLocaleDateString(), // イベントの開始日 eventEndDate.toLocaleDateString(), // イベントの終了日 "", // イベントの場所 (F列) event.getCreators()[0] // イベントの登録者名 ]); no++; eventStartDate.setDate(eventStartDate.getDate() + 1); // 開始日を翌日に更新 } } else { // 1日だけのイベントを通常通り表示 mySheet.appendRow([ no, // No calendars[i].getName(), event.getTitle(), // イベントタイトル "終日イベント", // イベントタイプ startTime.toLocaleDateString(), // イベントの開始日 endTime.toLocaleDateString(), // イベントの終了日 "", // イベントの場所 (F列) event.getCreators()[0] // イベントの登録者名 ]); no++; } } } }

試したこと・調べたこと

上記の詳細・結果

チャットGPTでいろいろ質問の方法を変えてみたのですがいい質問の方法が見つかりませんでした。

補足

特になし

コメントを投稿

0 コメント