Skip to content

Instantly share code, notes, and snippets.

@slarson
Created September 13, 2013 01:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save slarson/6546058 to your computer and use it in GitHub Desktop.
Save slarson/6546058 to your computer and use it in GitHub Desktop.
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