Skip to content

Instantly share code, notes, and snippets.

@aleguerra05
Last active March 29, 2024 03:28
Show Gist options
  • Save aleguerra05/a6bbaf3cb600cb6763eb46fa0c5031a3 to your computer and use it in GitHub Desktop.
Save aleguerra05/a6bbaf3cb600cb6763eb46fa0c5031a3 to your computer and use it in GitHub Desktop.
Google Script for retrieve Projects issues from GitHub using GraphQL API
// 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