ADVERTISEMENT

【Googleスプレッドシート】GitHub Issuesを一覧化!REST API経由でのリポジトリ取得

【Googleスプレッドシート】GitHub Issuesを一覧化!REST API経由でのリポジトリ取得
🛡️ 超解決

GitHubのIssuesをスプレッドシートで管理したいと考えたことはありませんか。手動でコピーして貼り付ける方法では、更新のたびに手間がかかります。この記事では、GitHub REST APIを利用して、リポジトリのIssuesをGoogleスプレッドシートに自動で一覧化する方法を解説します。IMPORTDATA関数を使った簡易的な方法と、Google Apps Scriptを使った柔軟な方法の2通りを紹介しますので、自分のニーズに合った手法を選べるようになります。

【要点】GitHub Issuesをスプレッドシートに自動取得する方法

  • IMPORTDATA関数を使う方法: パブリックリポジトリのIssuesをCSV形式で取得し、スプレッドシートに直接インポートします。認証不要で手軽に使えますが、プライベートリポジトリやカスタマイズには対応できません。
  • Google Apps Scriptを使う方法: GitHub APIにリクエストを送り、JSON形式のレスポンスをパースしてシートに書き込みます。プライベートリポジトリでも利用でき、取得項目の絞り込みや更新タイミングの制御が可能です。
  • トリガー設定による自動更新: Apps Scriptに時間主導型のトリガーを設定することで、定期的にIssuesを自動取得し、常に最新の状態を保てます。

ADVERTISEMENT

なぜREST APIを使うと便利なのか

GitHub Issuesはチーム開発のタスク管理に広く使われています。しかし、その情報をスプレッドシートで集計・分析したい場合、手動でエクスポートして貼り付けるのでは工数がかかりすぎます。GitHub REST APIを利用すれば、HTTPリクエスト一つでIssuesのデータをJSON形式で取得でき、スプレッドシートに自動的に反映できます。特に、複数のリポジトリを横断して一覧を作りたい場合や、特定のラベルやマイルストーンでフィルタリングしたい場合に威力を発揮します。また、API経由ならではのメリットとして、取得するフィールドを自由に選べる点があります。タイトル、状態、担当者、作成日時など必要な情報だけを抽出して、シート上で見やすく整理できます。

IMPORTDATA関数でシンプルに取得する手順

まずは、最も簡単な方法として、IMPORTDATA関数を使います。この関数は指定したURLのCSVデータをそのままシートに取り込みます。GitHub APIはIssuesの一覧をCSV形式で返すことも可能です(ただし、公式ドキュメントではJSONが推奨)。ここでは、パブリックリポジトリのIssuesをCSVで取得する方法を紹介します。

  1. APIエンドポイントを確認する
    GitHubのパブリックリポジトリのIssuesをCSVで取得するには、次のURLを使います。リポジトリのオーナー名とリポジトリ名を実際のものに置き換えてください。
    https://api.github.com/repos/{owner}/{repo}/issues
    ただし、このURLはJSONを返します。CSVを直接取得するには、.csvを付加した以下のURLを使用します(非公式ですが、多くのリポジトリで使えます)。
    https://github.com/{owner}/{repo}/issues.csv
    ただし、この方法はGitHubのウェブUIからのエクスポート機能を利用しており、API経由の正式な方法ではありません。最新のデータが取得できない場合もあります。
  2. IMPORTDATA関数を入力する
    スプレッドシートの任意のセル(例:A1)に次の式を入力します。
    =IMPORTDATA("https://github.com/{owner}/{repo}/issues.csv")
    注意点として、このURLはすべてのリポジトリで動作するわけではありません。特にIssuesが多いリポジトリではCSVの生成に時間がかかり、タイムアウトする可能性があります。また、プライベートリポジトリには認証が必要なため、この方法は使えません。
  3. データを整形する
    IMPORTDATAで取得したデータは、CSV形式でセルに展開されます。各列にはIssue番号、タイトル、状態などが含まれます。ただし、日付やラベルなどの一部の列はテキストとして結合されている場合があります。その場合は、スプレッドシートの関数(SPLITやREGEXEXTRACTなど)を使って分割すると、より見やすくなります。

Google Apps Scriptで柔軟に取得する手順

IMPORTDATA関数では対応できない要件(プライベートリポジトリ、特定のラベルでのフィルタリング、認証が必要な場合など)には、Google Apps Scriptを使います。ここでは、GitHub API v3を使用して、リポジトリのIssuesをJSONで取得し、スプレッドシートに書き込むスクリプトを作成します。

事前準備:GitHubのアクセストークンを取得する

  1. パーソナルアクセストークンを作成する
    GitHubのSettings → Developer settings → Personal access tokens → Tokens (classic) から、新しいトークンを生成します。スコープは「repo」を選択します(プライベートリポジトリのIssuesにアクセスするため)。トークンは一度しか表示されないので、安全な場所に保存してください。
  2. トークンをスプレッドシートに保存する
    トークンはスクリプト内に直接書かず、スプレッドシートのセルやスクリプトのプロパティに保存することを推奨します。ここでは、シートの見えないセル(例:シート名「config」のA1)にトークンを入力しておく方法を紹介します。ただし、他のユーザーと共有する場合は注意が必要です。

Apps Scriptエディタを開いてコードを書く

  1. スクリプトエディタを起動する
    スプレッドシートのメニューから「拡張機能」→「Apps Script」をクリックします。
  2. スクリプトコードを記述する
    以下のコードをコピーして貼り付けてください。このコードは、指定したリポジトリからIssuesを取得し、アクティブなシートに書き出します。
    function getGitHubIssues() {
      var owner = "リポジトリのオーナー名";
      var repo = "リポジトリ名";
      var token = "YOUR_PERSONAL_ACCESS_TOKEN"; // 実際のトークンに置き換える
      var url = "https://api.github.com/repos/" + owner + "/" + repo + "/issues?state=all&per_page=100&page=1";
      var options = {
        "headers": {
          "Authorization": "Bearer " + token
        },
        "muteHttpExceptions": true
      };
      var response = UrlFetchApp.fetch(url, options);
      var issues = JSON.parse(response.getContentText());
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.clear(); // 既存データをクリア
      // ヘッダー行
      var headers = ["Number", "Title", "State", "Created At", "Updated At", "User", "Labels"];
      sheet.appendRow(headers);
      // データ行
      for (var i = 0; i < issues.length; i++) {
        var issue = issues[i];
        if (issue.pull_request) continue; // Pull Requestはスキップ(Issuesのみ)
        var row = [
          issue.number,
          issue.title,
          issue.state,
          issue.created_at,
          issue.updated_at,
          issue.user.login,
          issue.labels.map(function(label) { return label.name; }).join(", ")
        ];
        sheet.appendRow(row);
      }
    }

    このコードでは、最初の100件のみを取得しています。全件取得するにはページング処理が必要ですが、基本的な流れを理解するためにこの形で十分です。

  3. 関数を実行する
    スクリプトエディタのメニューから関数「getGitHubIssues」を選択し、実行ボタンをクリックします。初回実行時には、スプレッドシートへのアクセス許可を求められるので、承認してください。

トリガーで定期的に自動更新する

  1. トリガーを設定する
    スクリプトエディタの左側メニューの「トリガー」アイコンをクリックし、「トリガーを追加」を選択します。
  2. トリガーの詳細を設定する
    関数に「getGitHubIssues」を選択し、イベントのソースを「時間主導型」、時間の間隔を「1時間おき」など希望の頻度に設定します。これで、定期的に最新のIssuesが自動取得されるようになります。

ADVERTISEMENT

使用時の注意点とよくあるトラブル

IMPORTDATA関数で404エラーが発生する

CSVのURLが正しくない場合や、リポジトリが存在しない場合に発生します。特に、リポジトリ名の大文字小文字は区別されるため、正確に入力してください。また、Issuesが一件もない場合は空のCSVが返り、何も表示されないことがあります。その場合は、タイムアウトしていないか確認してください。

Apps Scriptで403エラー(レート制限)が発生する

GitHub APIにはレート制限があります。認証なしの場合は1時間あたり60リクエスト、認証ありの場合は5000リクエストまでです。スクリプトを頻繁に実行する場合は、トークンを使って認証することで上限が上がります。それでも制限を超えた場合は、一定時間待つか、ページングを適切に処理してリクエスト数を減らしてください。

プライベートリポジトリのIssuesが取得できない

IMPORTDATA関数ではプライベートリポジトリにアクセスできません。必ずGoogle Apps Scriptを使い、アクセストークンに「repo」スコープを付与してください。また、トークンが漏洩しないよう、スクリプトのプロパティサービスを利用して安全に管理するのがよいでしょう。

Pull Requestが混ざってしまう

GitHub APIの/issuesエンドポイントは、デフォルトでPull Requestも含みます。上記のスクリプトでは、if (issue.pull_request) continue;で除外していますが、これを忘れるとPRまでIssuesとして扱われてしまいます。フィルタリングしたい場合は、ラベルや状態でさらに条件を追加するとよいです。

IMPORTDATA関数とApps Scriptの比較

項目 IMPORTDATA関数 Google Apps Script
セットアップの簡単さ 関数を入力するだけ コード記述と承認が必要
プライベートリポジトリ対応 不可 可能(トークン利用)
取得項目のカスタマイズ CSVの固定形式のみ JSONから自由に選択可能
自動更新の柔軟性 スプレッドシートの更新時に再計算(リアルタイムではない) トリガーで任意の間隔で自動実行可能
レート制限の影響 CSV取得はAPI経由でないため制限なし APIリクエストのため制限あり
データ量が多い場合 タイムアウトしやすい ページング処理で全件取得可能

まとめ

この記事では、GitHub IssuesをGoogleスプレッドシートに一覧化する2つの方法を解説しました。IMPORTDATA関数は手軽に始められますが、機能に制限があります。一方、Google Apps Scriptを使えば、プライベートリポジトリや細かいカスタマイズにも対応でき、トリガーによる自動更新も可能です。まずはIMPORTDATAで試して、要件に合わなければApps Scriptに移行するとよいでしょう。初期のスクリプトをベースに、ラベルフィルターやページング処理を追加すれば、より実用的なツールになります。ぜひ、自分のリポジトリのIssues管理に活用してみてください。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。