Last active
March 29, 2024 03:28
-
-
Save aleguerra05/a6bbaf3cb600cb6763eb46fa0c5031a3 to your computer and use it in GitHub Desktop.
Google Script for retrieve Projects issues from GitHub using GraphQL API
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
// Replace 'YOUR_ACCESS_TOKEN' with your GitHub access token | |
var accessToken = '<gitHubAccesToken>'; | |
// Replace 'YOUR_PROJECT_ID' with the desired project ID | |
var projectId = '<ProjectID>'; | |
function fetchGitHubData() { | |
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); | |
sheet.clear(); | |
projectId = projectId | |
var sheet_headers = ["number","repo","title","author","assignees","assignee_count","status","iteration","duedate","weight","spent","priority","total_weight"] | |
//clean active sheet, set headers, forzen first row | |
prepareSheet(sheet_headers) | |
var url = 'https://api.github.com/graphql'; | |
var headers = { | |
Authorization: 'Bearer ' + accessToken, | |
'Content-Type': 'application/json' | |
}; | |
var query = `query($project_id: ID!, $after: String){ | |
node(id: $project_id) { | |
... on ProjectV2 { | |
items(first: 100, after:$after) { | |
pageInfo { | |
hasNextPage | |
endCursor | |
} | |
nodes{ | |
creator{ | |
login | |
} | |
id | |
fieldValues(first: 20) { | |
nodes{ | |
... on ProjectV2ItemFieldTextValue { | |
text | |
field { | |
... on ProjectV2FieldCommon { | |
name | |
} | |
} | |
} | |
... on ProjectV2ItemFieldUserValue { | |
users(first: 10){ | |
nodes{ | |
login | |
} | |
} | |
field { | |
... on ProjectV2FieldCommon { | |
name | |
} | |
} | |
} | |
... on ProjectV2ItemFieldIterationValue { | |
title | |
field { | |
... on ProjectV2FieldCommon { | |
name | |
} | |
} | |
} | |
... on ProjectV2ItemFieldRepositoryValue { | |
repository { | |
name | |
} | |
field { | |
... on ProjectV2FieldCommon { | |
name | |
} | |
} | |
} | |
... on ProjectV2ItemFieldNumberValue { | |
number | |
field { | |
... on ProjectV2FieldCommon { | |
name | |
} | |
} | |
} | |
... on ProjectV2ItemFieldDateValue { | |
date | |
field { | |
... on ProjectV2FieldCommon { | |
name | |
} | |
} | |
} | |
... on ProjectV2ItemFieldSingleSelectValue { | |
name | |
field { | |
... on ProjectV2FieldCommon { | |
name | |
} | |
} | |
} | |
} | |
} | |
content{ | |
... on DraftIssue { | |
title | |
body | |
assignees(first: 10) { | |
nodes{ | |
login | |
} | |
} | |
} | |
...on Issue { | |
number | |
title | |
body | |
assignees(first: 10) { | |
nodes{ | |
login | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
}`; | |
var items = []; | |
var hasNextPage = true; | |
var endCursor = ''; | |
while(hasNextPage){ | |
const variables = { | |
project_id: projectId, | |
after: endCursor | |
}; | |
var options = { | |
method: 'post', | |
headers: headers, | |
payload: JSON.stringify({ query: query, variables: variables }), | |
}; | |
var response = UrlFetchApp.fetch(url, options); | |
var data = JSON.parse(response.getContentText()); | |
var tableData = []; | |
items = items.concat(data.data.node.items.nodes); | |
hasNextPage = data.data.node.items.pageInfo.hasNextPage; | |
endCursor = data.data.node.items.pageInfo.endCursor; | |
} | |
// Extract the desired fields from the GraphQL response | |
for (var i = 0; i < items.length; i++) { | |
var item = items[i]; | |
var fieldValueNodes = item.fieldValues.nodes; | |
var fieldValues = {}; | |
var repository='-'; | |
var assignees=''; | |
var due=''; | |
var status=''; | |
var priority=''; | |
var iteration=''; | |
var weight=''; | |
var spent=''; | |
for (var j = 0; j < fieldValueNodes.length; j++) { | |
var fieldValue = fieldValueNodes[j]; | |
if(fieldValue.field){ | |
if(fieldValue.field.name == "Assignees"){ | |
assignees = fieldValue.users.nodes.map(function(assignee) { | |
return assignee.login; | |
}).join(', '); | |
} else if (fieldValue.field.name == "Repository"){ | |
repository = fieldValue.repository.name; | |
} else if (fieldValue.field.name == "Due date" || fieldValue.field.name == "Due Date"){ | |
due = fieldValue.date; | |
} else if (fieldValue.field.name == "Status"){ | |
status = fieldValue.name; | |
} else if (fieldValue.field.name == "Priority"){ | |
priority = fieldValue.name; | |
} else if (fieldValue.field.name == "Iteration"){ | |
iteration = fieldValue.title; | |
} else if (fieldValue.field.name == "Weight"){ | |
weight = fieldValue.number; | |
} else if (fieldValue.field.name == "Spent time"|| fieldValue.field.name == "Hours Spent"){ | |
spent = fieldValue.number; | |
} | |
} | |
} | |
var content = item.content; | |
var assignee_count = (assignees === null || assignees == "") ? 0 : assignees.split(",").length; | |
var total_weight = weight * assignee_count; | |
var row = [ | |
content.number, | |
repository, | |
content.title, | |
//content.body, | |
item.creator.login, | |
assignees, | |
assignee_count, | |
status, | |
iteration, | |
due, | |
weight, | |
spent, | |
priority, | |
total_weight, | |
]; | |
tableData.push(row); | |
} | |
// Clear existing data in the table range | |
sheet.getRange('A2:M').clearContent(); | |
// Set the values in the table range | |
if (tableData.length > 0) { | |
sheet.getRange(2, 1, tableData.length, tableData[0].length).setValues(tableData); | |
} | |
sheet.autoResizeColumns(1, 25); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment