STERFIELD

2023/08/24

GitHubリポジトリからIssueを取得してスプレッドシートに追記するGAS(GraphQLバージョン)

GitHubリポジトリからIssueを取得してスプレッドシートに追記するGAS(GraphQLバージョン)

1.はじめに

GitHubは、ソフトウェア開発者にとって欠かせないツールの一つとなっています。Issue管理機能を活用すれば、プロジェクトのタスクやバグ、提案などを効率的に管理できます。今回は、GitHubのIssueを自動的にGoogleスプレッドシートに取得する方法を紹介します。

前回の記事では、RestAPIを通してIssueを取得するという方法を試みましたが、Issueの全件取得ができないなど課題を残すものになりましたが、もう一つの手法としてGraphQLにて取得する方法があり、GraphQLではIssueの全件取得に成功致しましたので、そのGASの全文もシェア致します。

https://sterfield.co.jp/blog/git-hub-gas/

REST API と graphQLの違い

ChatGPTが教えてくれた違いを記載します。

REST (Representational State Transfer) APIとGraphQLは、クライアントとサーバー間でデータをやり取りするための方法として使用されるインターフェイスですが、設計思想や操作方法が異なります。以下に主な違いを挙げます。

設計思想:

REST: RESTful設計はリソース指向です。それぞれのリソース(例:ユーザー、記事など)に対して一つのエンドポイントがあります。HTTPメソッド(GET、POST、PUT、DELETEなど)を使ってリソースに対する操作を行います。 GraphQL: GraphQLはデータ指向です。クライアントは必要なデータの構造を指定し、サーバーはその構造に基づいてデータを返します。一つのエンドポイントを持ち、クエリ言語を用いてデータの取得や変更を行います。 データの取得:

REST: クライアントはサーバーから提供されるエンドポイントに従ってデータを取得します。このため、過不足のデータが返されることがよくあります。 GraphQL: クライアントは必要なデータだけを指定して取得できます。これにより、過不足のデータが返されることが少なくなります。 エンドポイント:

REST: それぞれのリソースや操作に応じて多数のエンドポイントが存在します。 GraphQL: 一般的には一つのエンドポイント(たとえば /graphql)で全ての操作をカバーします。 エラーハンドリング:

REST: HTTPステータスコード(200, 404, 500など)を使ってエラーの種類を示します。 GraphQL: ほとんどの場合、200のHTTPステータスコードで応答し、エラーの詳細はレスポンスボディの中に含められます。 バージョン管理:

REST: 新しいバージョンのAPIをリリースする際、URLにバージョン情報を含めるなどの方法で旧バージョンとの互換性を維持することがよくあります。 GraphQL: フィールドやタイプを非推奨にするなどの方法で、APIの変更をスムーズに管理できます。 フレキシビリティ:

REST: サーバーサイドで提供されるエンドポイントとその構造に従わなければなりません。 GraphQL: クライアントがどのデータを必要としているかを明確に指定できるため、クライアントサイドでのフレキシビリティが高まります。 それぞれの技術には独自の利点と制約があります。使用する場面やニーズに応じて最適なものを選ぶことが重要です。

2.必要なもの

Googleアカウント
GitHubアカウント
GitHubのPersonal Access Token (リポジトリへのアクセス権限を持つもの)

3. 事前準備

3.1 GitHubのPersonal Access Tokenの取得

GitHubにログインして、Settings > Developer settings > Personal access tokens に進む。 "Generate new token" ボタンをクリック。 必要な権限を選択し、トークンを生成。

3.2 Google Apps Scriptの準備

Google Driveにアクセスし、新しいスプレッドシートを作成。 Extensions > Apps Script から、スクリプトエディタを開く。

4. スクリプトの作成

Google Apps Scriptのコードをスクリプトエディタにコピー&ペースト
※最下部にGAS全文掲載しています。
YOUR_GITHUB_TOKENとORGANIZATION_NAMEを、それぞれ適切な値に置き換える。

5. スクリプトの実行

スクリプトエディタの上部にある実行ボタンをクリック。 必要な権限を付与し、スクリプトを実行。

今回のGASでは実行できるメニューを追加しています。

6. 結果

Googleスプレッドシートに、GitHubのIssueの情報が自動で追記される。リポジトリ名、Issue番号、タイトル、作成日、更新日、URLなどの情報を取得できる。

7. まとめ

GitHubのIssueをGoogleスプレッドシートに自動取得する方法を紹介しました。この方法を利用することで、プロジェクトの進捗管理やレポート作成を効率的に行うことができます。さまざまなカスタマイズや拡張が可能なので、ご自身のニーズに合わせて活用してみてください。 当社では、一ヶ月毎にIssueの棚卸しに活用できそうだと話しています。

8. Google Apps Script全文

機能

  • スプレッドシートのメニューに実行ボタンを追加
  • アクティブなスプレッドシートを取得し、内容をクリア
  • リポジトリ名、Issue番号、タイトル、作成日、更新日、URLを列に追加

注意点

  • リポジトリの中の最初の100件のIssueを取得します。(first: 100)の値を変えることができるかは未検証
  • スクリプト実行の度にスプレッドシートの内容をクリアするため、書き込んだ内容も消えてしまいます。
1function onOpen() { 2 var ui = SpreadsheetApp.getUi(); 3 4 // カスタムメニューを追加 5 ui.createMenu('GitHub Menu') 6 .addItem('Fetch GitHub Issues', 'fetchAllRepoIssuesAndAppendToSheetWithUrl') 7 .addToUi(); 8} 9 10function fetchAllRepoIssuesAndAppendToSheetWithUrl() { 11 var GITHUB_API_URL = 'https://api.github.com/graphql'; 12 var GITHUB_TOKEN = 'YOUR_GITHUB_TOKEN'; // GitHubのPersonal access token 13 var ORG_NAME = 'ORGANIZATION_NAME'; 14 15 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 16 17 // スプレッドシートの内容をクリア 18 sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).clearContents(); 19 20 // リポジトリ一覧の取得 21 var repoQuery = ` 22 { 23 organization(login: "${ORG_NAME}") { 24 repositories(first: 100) { 25 edges { 26 node { 27 name 28 } 29 } 30 } 31 } 32 } 33 `; 34 35 var headers = { 36 'Authorization': 'bearer ' + GITHUB_TOKEN, 37 'Content-Type': 'application/json' 38 }; 39 40 var options = { 41 method: 'post', 42 headers: headers, 43 payload: JSON.stringify({query: repoQuery}) 44 }; 45 46 var response = UrlFetchApp.fetch(GITHUB_API_URL, options); 47 var jsonResponse = JSON.parse(response.getContentText()); 48 49 if (jsonResponse.errors) { 50 Logger.log(jsonResponse.errors); 51 return; 52 } 53 54 var repositories = jsonResponse.data.organization.repositories.edges; 55 56 // 各リポジトリからIssueを取得してスプレッドシートに追加 57 repositories.forEach(function(repo) { 58 var issueQuery = ` 59 { 60 repository(owner: "${ORG_NAME}", name: "${repo.node.name}") { 61 issues(first: 100, states: OPEN) { 62 edges { 63 node { 64 number 65 title 66 createdAt 67 updatedAt 68 } 69 } 70 } 71 } 72 } 73 `; 74 75 options.payload = JSON.stringify({query: issueQuery}); 76 response = UrlFetchApp.fetch(GITHUB_API_URL, options); 77 jsonResponse = JSON.parse(response.getContentText()); 78 79 if (jsonResponse.errors) { 80 Logger.log(jsonResponse.errors); 81 return; 82 } 83 84 var issues = jsonResponse.data.repository.issues.edges; 85 86 issues.forEach(function(issue) { 87 var issueUrl = `https://github.com/${ORG_NAME}/${repo.node.name}/issues/${issue.node.number}`; 88 89 sheet.appendRow([ 90 repo.node.name, 91 issue.node.number, 92 issue.node.title, 93 issue.node.createdAt, 94 issue.node.updatedAt, 95 issueUrl // F列にURLを追加 96 ]); 97 }); 98 }); 99} 100

Author Profile

著者近影

YUJI MEZAKI代表取締役副社長

代表取締役副社長をやっています。 越境ECとWebマーケの営業担当しています。 なんでもカリカリにチューニングして生産性あげるのが好きで勉強したビジネスフレームワークの記事多め。 趣味はPC自作で会社のWindowsデスクトップはほぼ自分が組みました。 1985年生/2008年早大卒/

SHARE

合わせて読みたい