Created
September 13, 2013 01:58
-
-
Save slarson/6546058 to your computer and use it in GitHub Desktop.
Trello Burndown Google Apps script modified from http://echobehind.wordpress.com/2012/06/28/create-your-own-burndown-chart-using-trello-api-and-google-apps-script/
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 trelloFetch(url) { | |
var key = "your_trello_API_key", | |
api_endpoint = "https://api.trello.com/1", | |
member_token = "your_member_TOKEN"; | |
var completeUrl = api_endpoint + url + "?key=" + key + "&token=" + member_token; | |
var jsonData = UrlFetchApp.fetch(completeUrl); | |
var object = Utilities.jsonParse(jsonData.getContentText()); | |
return object; | |
} | |
function getActiveSprintData(active_sprint_id) { | |
var active_sprint_lists, | |
active_sprint_cards, | |
done_list_id, | |
fires_done_list_id; | |
var points = [], | |
number_of_stories = 0, | |
points_all = 0, | |
points_left = 0, | |
points_fires = 0, | |
points_fires_left = 0, | |
points_fires_done = 0, | |
points_done = 0; | |
active_sprint_lists = trelloFetch("/boards/" + active_sprint_id + "/lists/"); | |
active_sprint_cards = trelloFetch("/boards/" + active_sprint_id + "/cards/"); | |
for (var i=0; i<active_sprint_lists.length; i++) { | |
if (active_sprint_lists[i].name == "Done") | |
done_list_id = active_sprint_lists[i].id; | |
if (active_sprint_lists[i].name.indexOf("Fires") != -1) | |
fires_done_list_id = active_sprint_lists[i].id; | |
} | |
for (var i=0; i<active_sprint_cards.length; i++) { | |
var regex = /\((\d+)\)/; | |
var story_point = active_sprint_cards[i].name.match(regex); | |
story_point = story_point ? parseInt(story_point[1]) : 0; | |
points_all += story_point; | |
number_of_stories++; | |
/* count fires separately and remove them from points_all */ | |
if (active_sprint_cards[i].labels[0]) { | |
for (var j=0; j<active_sprint_cards[i].labels.length; j++) { | |
if (active_sprint_cards[i].labels[j]['name'] == "Fires") { | |
points_fires += story_point; | |
points_all -= story_point; | |
} | |
} | |
} | |
/* count finished stories */ | |
if (active_sprint_cards[i].idList == done_list_id) { | |
points_done += story_point; | |
} | |
/* count finished fires */ | |
if (active_sprint_cards[i].idList == fires_done_list_id) { | |
points_fires_done += story_point; | |
} | |
} | |
points_left = points_all - points_done; | |
//points_fires_left = points_fires - points_fires_done; | |
points[0] = [points_left, points_fires, points_done, points_fires_done, points_all]; | |
return points; | |
} | |
/* fetch data from Trello and append it to Spreadsheet */ | |
/* Column 'J' must have the following stuff for this to work: | |
Sprint # // Sprint number – whatever you want | |
Name of sprint // Sprint name - whatever you want | |
21.6.2012 // Sprint start date – in that format | |
5.7.2012 // Sprint end date - in that format | |
board_id // board_id. Get it from your board URL format which | |
looks like this https://trello.com/b/[board_id]/new-board | |
*/ | |
function fetchData() { | |
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 data, | |
baserow = 2, | |
basecolumn = 1, | |
datenow = new Date(), | |
today = datenow.getDate() + "." + (datenow.getMonth()+1) + "." + datenow.getYear(), | |
active_sprint_id = sheet.getRange(5, sprint_info_column).getValue(); | |
while (sheet.getRange(baserow, basecolumn).getValue() != "") { | |
if (sheet.getRange(baserow, basecolumn).getValue() == today) | |
break; | |
baserow++; | |
} | |
data = getActiveSprintData(active_sprint_id); | |
sheet.getRange(baserow, basecolumn + 1, 1, 5).setValues(data); | |
} | |
/* generate dates from start to end of a sprint */ | |
function sprintStart() { | |
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 = start_date; | |
// generate headers | |
sheet.getRange(baserow - 1, basecolumn, 1, 6).setValues([['Date', 'Score', 'Fires', 'Score done', 'Fires done', 'Total score']]); | |
// generate dates | |
while (current_date.getTime() != end_date.getTime()) { | |
sheet.getRange(baserow, basecolumn, 1, 1).setValue(current_date.getDate() + "." + (current_date.getMonth()+1) + "." + current_date.getYear()); | |
current_date.setDate(current_date.getDate() + 1); | |
baserow++; | |
} | |
sheet.getRange(baserow, basecolumn, 1, 1).setValue(current_date.getDate() + "." + (current_date.getMonth()+1) + "." + current_date.getYear()); | |
// create 5min Trigger | |
ScriptApp.newTrigger("fetchData").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("sprintEnd").timeBased().at(end_date_trigger).create(); | |
} | |
/* remove all triggers when it comes to the end of a Sprint */ | |
function sprintEnd() { | |
var triggers = ScriptApp.getScriptTriggers(); | |
for (var i = 0; i < triggers.length; i++) { | |
ScriptApp.deleteTrigger(triggers[i]); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment