Skip to content

Instantly share code, notes, and snippets.

@xPi2
Created February 19, 2024 22:35
Show Gist options
  • Save xPi2/efadf9148b2b645a012d99807f088859 to your computer and use it in GitHub Desktop.
Save xPi2/efadf9148b2b645a012d99807f088859 to your computer and use it in GitHub Desktop.
google-calendar-sync
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);
}
}
@xPi2
Copy link
Author

xPi2 commented Feb 19, 2024

Setup

  1. Share your personal calendar with your work account (remember to accept the calendar in your work account)
  2. Copy your personal calendar id Settings and sharing > Integrate Calendar
  3. Create a new Google App Script project under your work account
  4. Paste this script and replace the id variable with your personal calendar id
  5. Add Calendar service to the project
  6. Save and run the script once (it will ask for permissions to access your calendar)
  7. Add a trigger (left sidebar) to run the script on every personal calendar update

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment