これは何か
GitHub Issueに起票したものをスプレッドシートに転記するシステムを制作したため、制作方法を記事にします。
使用したサービスやAPI
- Google スプレッドシート
- Google Apps Script
- GitHub Issue
- issue取得API
機能
- issue取得APIを利用してgithub issueに起票されているissueを取得し、スプレッドシートに転記
- issue番号、タイトル、ラベル、マイルストーン、担当者、状態、issueURLを転記
- スプレッドシートの関数を使用して状態がcloseになっているissueは、行全体を灰色にして完了していることが分かるようにする
- トリガーを時間に設定し、1時間ごとにスプレッドシートの更新を行う
スプレッドシート
スプレッドシートには以下の項目を転記しています。
- issue番号
- issueタイトル
- ラベル
- マイルストーン
- 担当者
- 状態
- 最終更新日時
- issue URL
Google Apps Script
GASにコードを書き始める前にGithubでアクセストークンを発行しておく。
参照:個人用アクセストークンの作成
<br />//Github issue取得APIを利用してissueを取得する function GetOpenIssues() { var OWNER = 'リポジトリのオーナー名'; var REPO = 'リポジトリ名' var url = 'https://api.github.com/repos/' + OWNER + '/' + REPO + '/issues?state=all&sort=created'; var accessToken = '発行したアクセストークン'; var headers = { 'Authorization': 'token '+ accessToken }; var options = { 'method': 'GET', 'headers': headers, }; var response = UrlFetchApp.fetch(url, options).getContentText(); var data = JSON.parse(response); return data; } //転記を実行する function UpdateGSheet(issueDataList) { issueDataList = GetOpenIssues(); var sheetId = '転記したいスプレッドシートのID'; var sheetName = '転記したいシート名'; var ss = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName); var issueObjectList = [] var issueSize = Object.keys(issueDataList).length; for(var index = 0;index < issueSize ;index++){ var d = issueDataList[index]; var issueObject = UpdateIssue(d); issueObjectList.push(issueObject); } var issueInfoSize = Object.keys(issueObjectList[0]).length; // シートをクリア ClearBeforeSheetInfo(ss); ss.getRange(2,1,issueSize,issueInfoSize).setValues(issueObjectList); } //シートに更新内容を転記する前にシートの中身を一度削除する function ClearBeforeSheetInfo(sheet){ var range = sheet.getRange("A2:X100"); range.clear({contentsOnly: true}); } //転記する内容の定義 function UpdateIssue(issueData){ var number = issueData['number']; var title = issueData['title']; var updated_at = new Date(issueData['updated_at']); var jst_updated_at = Utilities.formatDate(updated_at, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss'); var state = issueData['state']; if(issueData['assignee']){ var assign = issueData['assignee']['login'] } else { assign = '指定なし' } if(issueData['milestone']){ var milestone = issueData['milestone']['title'] } else { milestone = '' } var labelNames = ""; for (var i = 0; i < issueData['labels'].length; i++) { //ラベルを全て取得してカンマ区切りで格納 labelNames += issueData['labels'][i]['name'] + ","; } //カンマが一つ余分なので、余分なカンマを削除 labelName = labelNames.slice(0, -1); var issueList = [] issueList = [ number, title, labelName, milestone, assign, state, jst_updated_at, issueData['url'] ] return issueList; }