Created
September 24, 2013 02:50
-
-
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.
This file contains hidden or 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 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