Created
February 19, 2024 22:35
-
-
Save xPi2/efadf9148b2b645a012d99807f088859 to your computer and use it in GitHub Desktop.
google-calendar-sync
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function sync() { | |
var id="XXXX"; // CHANGE - id of the secondary calendar to pull events from | |
var today=new Date(); | |
var enddate=new Date(); | |
enddate.setDate(today.getDate()+15); // how many days in advance to monitor and block off time | |
var secondaryCal=CalendarApp.getCalendarById(id); | |
var secondaryEvents=secondaryCal.getEvents(today,enddate); | |
var primaryCal=CalendarApp.getDefaultCalendar(); | |
var primaryEvents=primaryCal.getEvents(today,enddate); // all primary calendar events | |
var primaryEventTitle="OOO"; // update this to the text you'd like to appear in the new events created in primary calendar | |
var stat=1; | |
var evi, existingEvent; | |
var primaryEventsFiltered = []; // to contain primary calendar events that were previously created from secondary calendar | |
var primaryEventsUpdated = []; // to contain primary calendar events that were updated from secondary calendar | |
var primaryEventsCreated = []; // to contain primary calendar events that were created from secondary calendar | |
var primaryEventsDeleted = []; // to contain primary calendar events previously created that have been deleted from secondary calendar | |
Logger.log('Number of primaryEvents: ' + primaryEvents.length); | |
Logger.log('Number of secondaryEvents: ' + secondaryEvents.length); | |
// create filtered list of existing primary calendar events that were previously created from the secondary calendar | |
for (pev in primaryEvents) | |
{ | |
var pEvent = primaryEvents[pev]; | |
if (pEvent.getTitle() == primaryEventTitle) | |
{ primaryEventsFiltered.push(pEvent); } | |
} | |
// process all events in secondary calendar | |
for (sev in secondaryEvents) | |
{ | |
stat=1; | |
evi=secondaryEvents[sev]; | |
// if the secondary event has already been blocked in the primary calendar, update it | |
for (existingEvent in primaryEventsFiltered) | |
{ | |
var pEvent = primaryEventsFiltered[existingEvent]; | |
var secondaryTitle = evi.getTitle(); | |
var secondaryDesc = evi.getDescription(); | |
if ((pEvent.getStartTime().getTime()==evi.getStartTime().getTime()) && (pEvent.getEndTime().getTime()==evi.getEndTime().getTime())) | |
{ | |
stat=0; | |
pEvent.setTitle(primaryEventTitle); | |
pEvent.setDescription(secondaryTitle + '\n\n' + secondaryDesc); | |
// event.setDescription(evi.getTitle() + '\n\n' + evi.getDescription()); | |
pEvent.setVisibility(CalendarApp.Visibility.PRIVATE); // set blocked time as private appointments in work calendar | |
primaryEventsUpdated.push(pEvent.getId()); | |
Logger.log('PRIMARY EVENT UPDATED' | |
+ '\nprimaryId: ' + pEvent.getId() + ' \nprimaryTitle: ' + pEvent.getTitle() + ' \nprimaryDesc: ' + pEvent.getDescription()); | |
} | |
} | |
if (stat==0) continue; | |
var d = evi.getStartTime(); | |
var n = d.getDay(); | |
if (evi.isAllDayEvent()) | |
{ | |
continue; // Do nothing if the event is an all-day or multi-day event. This script only syncs hour-based events | |
} | |
else if (n==1 || n==2 || n==3 || n==4 || n==5) // skip weekends. Delete this if you want to include weekends | |
// if the secondary event does not exist in the primary calendar, create it | |
{ | |
//var description = evi.getTitle() + '\n\n' + evi.getDescription(); | |
// Creates Out Of Office events using the Calendar Service | |
var newEvent = createOutOfOffice(primaryCal.getId(), evi.getStartTime(), evi.getEndTime(), primaryEventTitle); | |
// Creates event using the Calendar Client | |
/* | |
var newEvent = primaryCal.createEvent(primaryEventTitle,evi.getStartTime(),evi.getEndTime()); // change the Booked text to whatever you would like your merged event titles to be | |
// alternative version below that copies the exact secondary event information into the primary calendar event | |
// var newEvent = primaryCal.createEvent(evi.getTitle(),evi.getStartTime(),evi.getEndTime(), {location: evi.getLocation(), description: evi.getDescription()}); | |
newEvent.setDescription(description); | |
newEvent.setVisibility(CalendarApp.Visibility.PRIVATE); // set blocked time as private appointments in work calendar | |
newEvent.removeAllReminders(); // so you don't get double notifications. Delete this if you want to keep the default reminders for your newly created primary calendar events | |
primaryEventsCreated.push(newEvent.getId()); | |
Logger.log('PRIMARY EVENT CREATED' | |
+ '\nprimaryId: ' + newEvent.getId() + '\nprimaryTitle: ' + newEvent.getTitle() + '\nprimaryDesc ' + newEvent.getDescription() + '\n'); | |
*/ | |
} | |
} | |
// if a primary event previously created no longer exists in the secondary calendar, delete it | |
for (pev in primaryEventsFiltered) | |
{ | |
var pevIsUpdatedIndex = primaryEventsUpdated.indexOf(primaryEventsFiltered[pev].getId()); | |
if (pevIsUpdatedIndex == -1) | |
{ | |
var pevIdToDelete = primaryEventsFiltered[pev].getId(); | |
Logger.log(pevIdToDelete + ' deleted'); | |
primaryEventsDeleted.push(pevIdToDelete); | |
primaryEventsFiltered[pev].deleteEvent(); | |
} | |
} | |
Logger.log('Primary events previously created: ' + primaryEventsFiltered.length); | |
Logger.log('Primary events updated: ' + primaryEventsUpdated.length); | |
Logger.log('Primary events deleted: ' + primaryEventsDeleted.length); | |
Logger.log('Primary events created: ' + primaryEventsCreated.length); | |
} | |
// Creates Out Of Office events using the Calendar Service | |
function createOutOfOffice(calendarId, start, end, summary = 'OOO') { | |
// event details for creating event. | |
let event = { | |
summary: summary, // Replace this with whatever name you want for the out of office events | |
start: { | |
dateTime: start.toISOString() | |
}, | |
end: { | |
dateTime: end.toISOString() | |
}, | |
eventType: 'outOfOffice', | |
outOfOfficeProperties: { | |
autoDeclineMode: 'declineOnlyNewConflictingInvitations', | |
declineMessage: 'Out of Office', | |
} | |
}; | |
try { | |
// call method to insert/create new event in provided calandar | |
event = Calendar.Events.insert(event, calendarId); | |
Logger.log('Primary Event Created' + '\id: ' + event.id + '\ntitle: ' + event.summary); | |
return event; | |
} catch (err) { | |
console.log('Failed with error %s', err.message); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Setup
Settings and sharing > Integrate Calendar
id
variable with your personal calendar id