Skip to content

Instantly share code, notes, and snippets.

@catrincm
Last active February 26, 2024 14:38
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save catrincm/b7fce07a26f85be4331ae04a14fe9743 to your computer and use it in GitHub Desktop.
Save catrincm/b7fce07a26f85be4331ae04a14fe9743 to your computer and use it in GitHub Desktop.
Email yourself weekly calendar agenda with google apps script
EMAILRECIPIANT = "myemail@gmail.com";
function agendaEmail() {
let dateOptions = { weekday: 'long', month: 'long', day: 'numeric'};
let timeOptions = { hour12:true, hour:'numeric', minute:'numeric'};
var StartDate = new Date();
Logger.log('from: ' + StartDate);
var EndDate = new Date(StartDate);
EndDate.setDate(EndDate.getDate() + 7);
Logger.log('until: ' +EndDate);
var calendars = CalendarApp.getAllCalendars(); // to view events from all calendars owned or subscribed to.
/*
// To view events from listed calendars:
var calendarsById = ['myemail@gmail.com','asdfoij8wef9o12ijrl@import.calendar.google.com'];
var calendars = [];
for (i = 0; i < calendarsById.length; i++){
calendars.push(CalendarApp.getCalendarById(calendarsById[i]));
}
*/
Logger.log('Displaying events from %s calendars.', calendars.length);
var events = [];
for (i = 0; i < calendars.length; i++){
var thisCal = calendars[i];
Logger.log("calendar: " + thisCal.getName());
var thisCalEvents = thisCal.getEvents(StartDate, EndDate);
for (j = 0; j < thisCalEvents.length; j++){
var thisCalEvent = thisCalEvents[j];
// if it is an allday event, then "enddate" is midnight the day after it. So minus one minute from it. (It'd be better to do this in events.push itself, but im not sure how. )
var endtime = thisCalEvent.getEndTime()
if (thisCalEvent.isAllDayEvent()) {
endtime.setMinutes(endtime.getMinutes() - 1);
}
events.push({
all_day: thisCalEvent.isAllDayEvent(),
calendar: thisCal.getName(),
start_time: thisCalEvent.getStartTime(),
end_time: endtime,
title: thisCalEvent.getTitle(),
description: thisCalEvent.getDescription().replace(new RegExp('\r?\n','g'), '<br />').replace(new RegExp('<http([^>]*)>'),' (<a href="http$1">link</a>)'),
location: thisCalEvent.getLocation()
});
}
}
Logger.log('number of events: ' + events.length);
events.sort(function(a, b){
return a.start_time-b.start_time
});
// The email contains two lists of all the events: firstly a summary itemized list just with title and day/time, then a "further details" part.
var eventsSummaryMessage = "Events this week:"
var eventsFurtherMessage = "Further information:"
eventsSummaryMessage += "<br><ul>";
eventsFurtherMessage += "<br>";
if (events.length > 0) {
for (k = 0; k < events.length; k++){
var thisEvent = events[k];
Logger.log('printing event: ' + thisEvent.title);
eventsFurtherMessage += '<p style="border-top: 1px black solid"><br />';
eventsSummaryMessage += '<li>';
eventsSummaryMessage += thisEvent.title;
eventsFurtherMessage += '<strong>' + thisEvent.title + '</strong><br />';
// date display depends on: whether it is all day event, and whether starting date and ending date are equal.
if (thisEvent.all_day){
if (thisEvent.start_time.getDate() == thisEvent.end_time.getDate()) {
eventsFurtherMessage += thisEvent.start_time.toLocaleString({},dateOptions) + '<br />';
eventsSummaryMessage += " (" + thisEvent.start_time.toLocaleString({},{weekday: 'short'}) + ")";
} else{
eventsFurtherMessage += thisEvent.start_time.toLocaleString({},dateOptions) + ' - ' + thisEvent.start_time.toLocaleString({},dateOptions) + '<br />';
eventsSummaryMessage += " (" + thisEvent.start_time.toLocaleString({},{weekday: 'short'}) + ' - ' + thisEvent.start_time.toLocaleString({},{weekday: 'short'}) + ")";
}
} else {
if (thisEvent.start_time.getDate() == thisEvent.end_time.getDate()) {
eventsFurtherMessage += thisEvent.start_time.toLocaleString({},dateOptions) + ", " + thisEvent.start_time.toLocaleString({},timeOptions)
+ " - " + thisEvent.end_time.toLocaleString({},timeOptions) + '<br />';
eventsSummaryMessage += " (" + thisEvent.start_time.toLocaleString({},{weekday: 'short'}) + ', ' + thisEvent.start_time.toLocaleString({},timeOptions) + ")";
} else{
eventsFurtherMessage += thisEvent.start_time.toLocaleString({},dateOptions) + ", " + thisEvent.start_time.toLocaleString({},timeOptions)
+ ' - ' + thisEvent.end_time.toLocaleString({},dateOptions) + ", " + thisEvent.end_time.toLocaleString({},timeOptions) + '<br />';
eventsSummaryMessage += " (" + thisEvent.start_time.toLocaleString({},{weekday: 'short'}) + ' - ' + thisEvent.start_time.toLocaleString({},{weekday: 'short'}) + ")";
}
}
if (calendars.length > 1) {
eventsFurtherMessage += '<br>Calendar: ' + thisEvent.calendar;
}
if (thisEvent.location) {
eventsFurtherMessage += '<br>Where: ' + thisEvent.location + '<p>';
}
if (thisEvent.description) {
eventsFurtherMessage += thisEvent.description;
}
eventsSummaryMessage += '</li>';
eventsFurtherMessage += '</p>';
}
eventsSummaryMessage += '</ul>';
var message = "<p>" + eventsSummaryMessage + "</p><p>" + eventsFurtherMessage ;
} else {
message += '<p>Nothing on any of your calendars this week.</p>';
}
Logger.log('message: \n\n' + message);
MailApp.sendEmail(EMAILRECIPIANT, "Events this week", message, {htmlBody: message});
}
@catrincm
Copy link
Author

catrincm commented Jul 11, 2020

How to use:

@catrincm
Copy link
Author

@bonelifer
Copy link

Awesome script.

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