recurring events google calendar

32 views
Skip to first unread message

Ullrich Braun

unread,
Jul 14, 2024, 8:16:42 AM (yesterday) Jul 14
to Google Apps Script Community

Hello,

I have a problem with my children's calendars. We live in Switzerland, and the school is frequently interrupted by holidays or vacations. Each child has their own calendar, and all classes are recorded as recurring events. I would like the recurring events to be interrupted during the holidays so that no events are scheduled during those periods.

I tried to create a script with the help of Chat GPT, but it is not working correctly. Could someone take a look at the script and help improve it, please?

function manageRecurringEventsDuringHolidays() {
var calendarId = '????@group.calendar.google.com'; // Ersetze dies mit deiner Kalender-ID
var calendar = CalendarApp.getCalendarById(calendarId);

if (!calendar) {
Logger.log('Kalender mit der ID ' + calendarId + ' konnte nicht gefunden werden.');
return;
}

// Hole alle wiederkehrenden Termine für einen bestimmten Zeitraum
var events = calendar.getEvents(new Date('2024-08-19'), new Date('2025-12-31')).filter(event => event.isRecurringEvent());

processEvents(calendar, events, 0); // Starte die Verarbeitung der Ereignisse
}

function processEvents(calendar, events, index) {
if (index >= events.length) {
Logger.log("Alle Ereignisse wurden verarbeitet.");
return;
}

var event = events[index];
try {
if (event) {
var eventSeries = event.getEventSeries();
if (eventSeries) {
// Speichere die ursprünglichen Ereignisdaten
var startTime = event.getStartTime();
var endTime = event.getEndTime();
var title = event.getTitle();
var description = event.getDescription();
var location = event.getLocation();

var originalEventDetails = {
title: title,
description: description,
location: location,
startTime: startTime,
endTime: endTime,
startHour: startTime.getHours(),
startMinute: startTime.getMinutes(),
endHour: endTime.getHours(),
endMinute: endTime.getMinutes()
};

Logger.log('Speichere Ereignisdaten: ' + JSON.stringify(originalEventDetails));

// Lösche die ursprüngliche Ereignisserie
eventSeries.deleteEventSeries();
Utilities.sleep(1000); // Pause einfügen

// Definiere die Schulferien und Feiertage
var holidays = [
{ start: '2024-09-09', end: '2024-09-09' },
{ start: '2024-10-07', end: '2024-10-18' },
{ start: '2024-11-12', end: '2024-11-12' },
{ start: '2024-11-13', end: '2024-11-13' },
{ start: '2024-11-14', end: '2024-11-14' },
{ start: '2024-12-20', end: '2024-12-20' },
{ start: '2024-12-23', end: '2025-01-03' },
{ start: '2025-02-10', end: '2025-02-21' },
{ start: '2025-04-17', end: '2025-04-17' },
{ start: '2025-04-18', end: '2025-04-21' },
{ start: '2025-04-21', end: '2025-05-02' },
{ start: '2025-04-28', end: '2025-04-28' },
{ start: '2025-05-01', end: '2025-05-01' },
{ start: '2025-05-29', end: '2025-05-29' },
{ start: '2025-05-30', end: '2025-05-30' },
{ start: '2025-06-09', end: '2025-06-09' },
{ start: '2025-06-10', end: '2025-06-10' },
{ start: '2025-07-11', end: '2025-07-11' },
{ start: '2025-07-14', end: '2025-08-15' },
{ start: '2025-08-18', end: '2025-08-18' }
];

// Teile die Ereignisserie in Blöcke auf, die nicht in die Ferien fallen
var currentStartDate = new Date(originalEventDetails.startTime);
var currentEndDate = new Date(originalEventDetails.endTime);

holidays.forEach(function(holiday) {
var holidayStart = new Date(holiday.start);
var holidayEnd = new Date(holiday.end);

// Erstelle eine Ereignisserie bis zum Beginn der Ferien
if (currentStartDate < holidayStart) {
var newStart = new Date(currentStartDate);
newStart.setHours(originalEventDetails.startHour);
newStart.setMinutes(originalEventDetails.startMinute);

var newEnd = new Date(currentEndDate);
newEnd.setHours(originalEventDetails.endHour);
newEnd.setMinutes(originalEventDetails.endMinute);

calendar.createEventSeries(
originalEventDetails.title,
newStart,
newEnd,
CalendarApp.newRecurrence().addWeeklyRule().until(new Date(holidayStart.getTime() - 24 * 60 * 60 * 1000))
).setDescription(originalEventDetails.description).setLocation(originalEventDetails.location);
Utilities.sleep(1000); // Pause einfügen
}

// Setze die Ereignisserie nach den Ferien fort
currentStartDate = new Date(holidayEnd.getTime() + 24 * 60 * 60 * 1000);
currentEndDate = new Date(currentStartDate.getTime() + (originalEventDetails.endTime - originalEventDetails.startTime));
});

// Erstelle eine Ereignisserie nach der letzten Ferienzeit
var lastHoliday = holidays[holidays.length - 1];
var lastHolidayEnd = new Date(lastHoliday.end);
if (currentStartDate > lastHolidayEnd) {
var newStart = new Date(currentStartDate);
newStart.setHours(originalEventDetails.startHour);
newStart.setMinutes(originalEventDetails.startMinute);

var newEnd = new Date(currentEndDate);
newEnd.setHours(originalEventDetails.endHour);
newEnd.setMinutes(originalEventDetails.endMinute);

calendar.createEventSeries(
originalEventDetails.title,
newStart,
newEnd,
CalendarApp.newRecurrence().addWeeklyRule().until(new Date('2025-12-31'))
).setDescription(originalEventDetails.description).setLocation(originalEventDetails.location);
Utilities.sleep(1000); // Pause einfügen
}
} else {
Logger.log('Ereignisserie existiert nicht für: ' + event.getTitle());
}
}
} catch (e) {
Logger.log('Fehler beim Bearbeiten des Ereignisses: ' + event.getTitle() + ' - ' + e.message);
}

// Verarbeite das nächste Ereignis nach einer kurzen Pause
Utilities.sleep(2000);
processEvents(calendar, events, index + 1);
}

Reply all
Reply to author
Forward
0 new messages