oogleSpreadSheet가 GitHub Issue 목록을 표시하는 방법 - 협력 방법

GitHub API Issue x Google SpreadSheet 연동





모든 리포지토리의 issue 목록을 표시합니다.
리포지토리 이름의 시트가 있으면 거기에, 없으면 추가해 줍니다.
스프레드시트측의 기능으로 조건부 서식으로 닫은 issue를 어둡게 하거나,
GitHub의 API로 닫은 녀석을 표시하지 않는, 최근 1개월만 표시라든가,
여러 가지 시도해보십시오.

GitHub API
htps : //로 ゔぇぺぺr. 기주 b. 이 m/v3/

넣는 방법



스프레드시트 열기

도구

스크립트 편집기

아래 코드를 넣어

저장 및 실행, 권한 부여

트리거도 설정할 수 있습니다.

code



※access_token은 여기에서 발행해 주세요
htps : // 기주 b. 코 m / 세팅 gs / 토켄 s
function myFunction() {

  var GITHUB_OWNER = 'owner_name'; // レポジトリのオーナー名を入れてください
  var GITHUB_ACCESS_TOKEN = 'access_token'; // 上記で発行したaccess tokenを入れてください
  var REPOSITORIES = ['repository_name'] // 出したいレポジトリ名を入れてください

  // APIからissueのjsonを取得
  var getIssues = function(repository){
    var url = 'https://api.github.com/repos/' + GITHUB_OWNER + '/' + repository + '/issues?state=all&sort=created&direction=asc&access_token=' + GITHUB_ACCESS_TOKEN;
    var response = UrlFetchApp.fetch(url);

    var json = response.getContentText();
    return JSON.parse(json);
  }

  // issueのjsonから中身を取得
  var getAttributesOfIssue = function(issue){
    var milestone = "";
    if(issue["milestone"]){
      milestone = issue["milestone"]["title"];
    }

    var labels = "";
    if(issue["labels"]){
      labels = issue["labels"].map(function(label){
        return label["name"]
      }).join(",");
    }

    var assignee = "";
    if(issue["assignee"]){
      assignee = issue["assignee"]["login"];
    }

    var due_on = "";
    if(issue["milestone"] && issue["milestone"]["due_on"]){
      due_on = issue["milestone"]["due_on"].substring(0, 10);
    }

    var opend_at = "";
    if(issue["created_at"]){
      opend_at = issue["created_at"].substring(0, 10);
    }

    var closed_at = "";
    if(issue["closed_at"]){
      closed_at = issue["closed_at"].substring(0, 10);
    }

    var url = '=HYPERLINK("' + issue["html_url"] + '","' + issue["number"] + '")';

    return [
      milestone,
      issue["title"],
      assignee,
      issue["state"],
      labels,
      due_on,
      opend_at,
      closed_at,
      url
    ]
  }

  var sortByValueOfIndex = function(ary, index){
    return ary.sort(function(a,b){
      if( a[index] < b[index] ) return -1;
      if( a[index] > b[index] ) return 1;
      return 0;
    });
  }

  // スプレッドシートを取得
  var ss = SpreadsheetApp.getActive()

  // 指定したレポジトリでシートに反映していく
  REPOSITORIES.forEach(function(repository){
    var issues = getIssues(repository).map(function(issue){
      return getAttributesOfIssue(issue);
    });

    // due on でソートしています
    issues = sortByValueOfIndex(issues, 5);
    var titles = ["Milestone", "Title", "Assignee", "Status", "Labels", "due_on", "opened_at", "closed_at", "Issue URL"];
    issues.unshift(titles);

    var sheet = ss.getSheetByName(repository);
    if(sheet == null) {
      ss.insertSheet(repository);
      sheet = ss.getSheetByName(repository);
    }
    sheet.getRange("A1:I" + (issues.length).toString()).setValues(issues);
  });
}

굉장히 신경이 쓰이면, 적당하게 끝내고 있는 부분등을 고쳐 줍니다.
편집 요청도 환영합니다.

좋은 웹페이지 즐겨찾기