Skip to content

Instantly share code, notes, and snippets.

@slarson
Created September 24, 2013 02:50
Show Gist options
  • Save slarson/6679778 to your computer and use it in GitHub Desktop.
Save slarson/6679778 to your computer and use it in GitHub Desktop.
Google App Script for calculating free time across multiple Google calendars. Writes results to a Google spreadsheet so they can be plotted.
function startCounting() {
// create 5min Trigger
ScriptApp.newTrigger("countEvents").timeBased().everyMinutes(5).create();
// create end Trigger
//var end_date_trigger = new Date(end_date_array[2], end_date_array[1] - 1, end_date_array[0], 10);
//ScriptApp.newTrigger("stopCounting").timeBased().at(end_date_trigger).create();
}
/* remove all triggers when it comes to the end of a Sprint */
function stopCounting() {
var triggers = ScriptApp.getScriptTriggers();
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
/**
* It would count FULL hours that did not have any events set between 7am and 6pm
* and it would tell me how many there were.
*/
function countEvents() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(),
active_sheet = "",
sprint_info_column = 10;
for (var i=0; i<sheets.length; i++) {
if (sheets[i].getName().indexOf("#active") != -1)
active_sheet = sheets[i].getName();
}
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(active_sheet);
var baserow = 2,
basecolumn = 1;
var start_date_array = sheet.getRange(3, sprint_info_column).getValue().split("."),
end_date_array = sheet.getRange(4, sprint_info_column).getValue().split(".");
var start_date = new Date(start_date_array[2], parseInt(start_date_array[1])-1, parseInt(start_date_array[0])),
end_date = new Date(end_date_array[2], parseInt(end_date_array[1])-1, parseInt(end_date_array[0]));
var current_date = new Date(start_date.getTime());
// generate headers
sheet.getRange(baserow - 1, basecolumn + 1, 1, 1).setValues([['Hours Free']]);
//create calendards
var cals = new Array();
cals.push(CalendarApp.getDefaultCalendar());
cals.push(CalendarApp.getCalendarById('[calendar id]'));
//travel calendar
cals.push(CalendarApp.getCalendarById('[calendar id]'));
// generate dates
var row = baserow;
while (current_date.getTime() != end_date.getTime()) {
sheet.getRange(row, basecolumn, 1, 1).setValue(current_date.getDate() + "." + (current_date.getMonth()+1) + "." + current_date.getYear());
current_date.setDate(current_date.getDate() + 1);
row++;
}
sheet.getRange(row, basecolumn, 1, 1).setValue(current_date.getDate() + "." + (current_date.getMonth()+1) + "." + current_date.getYear());
//find hours
var now = new Date(start_date.getTime() + (7 * 60 * 60 *1000));
for (var j = 0; j < 5; j++ ) {
beginningOfDay = new Date(now.getTime() + (j * 24 * 60 * 60 * 1000));
endOfDay = new Date(now.getTime() + (j * 24 * 60 * 60 * 1000) + (10 * 60 * 60 * 1000));
Logger.log('beginning: ' + beginningOfDay);
Logger.log('end: ' + endOfDay);
/* presumed time budget:
10 hour day
minus 1.5 hours for email
minus 1 hour for break
minus 1 hour for travel time to and from campus
= 6.5 hours
*/
totalHours = 6.5;
for (var i = 0; i < cals.length; i++) {
var events = cals[i].getEvents(beginningOfDay, endOfDay);
Logger.log('Number of events in cal ' + i + ': ' + events.length);
for (var k = 0; k < events.length; k++) {
//TODO: improve exclusion of events I have declined by checking for alternate
// email ids
if (events[k].isAllDayEvent() == false && events[k].getMyStatus() != CalendarApp.GuestStatus.NO) {
Logger.log(events[k].getTitle());
var start = events[k].getStartTime();
var end = events[k].getEndTime();
Logger.log(start);
Logger.log(end);
var eventLength = ((end - start)/ (60 * 60 * 1000));
Logger.log("length: " + eventLength + " hours");
totalHours = totalHours - eventLength;
}
}
}
sheet.getRange(baserow + j, basecolumn + 1, 1, 1).setValues([[totalHours]]);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment