【Python】Backlog API で課題一覧を取得し CSV 出力する方法

  • URLをコピーしました!
目次

はじめに

Backlog は便利なプロジェクト管理ツールですが、毎日の進捗確認や未消化課題のリストアップなど、画面を操作して情報を集める作業を「面倒だな」と感じたことはありませんか?

Web ブラウザで行う操作の大部分は、Backlog API を使うことでプログラムから自動実行できます。 本記事では、Python を使って Backlog のデータを自在に操る第一歩として、課題情報の取得からレポート(CSV)作成までを自動化する手順を解説します。

この記事でわかること
  • Backlog API を使うための事前準備(API キー、プロジェクト ID の確認方法)
  • Python を使って Backlog から課題データを取得する基本コード
  • 【実践】 「未完了」かつ「優先度:高」の課題だけを抽出し、CSV ファイルに出力する方法

事前準備:API キーとプロジェクト ID の確認

Python から Backlog を操作するためには、認証情報の「API キー」と、操作対象を指定する「プロジェクト ID」の2つが必要です。

API キーの取得

API キーは、個人のアカウントに紐付くパスワードのようなものです。

  1. Backlog にログインし、画面右上のアイコンから [個人設定] を開きます。
  2. 左メニューの [API] をクリックします。
  3. メモ欄(例: python_script など)を入力し、[登録] ボタンをクリックします。

発行された長い文字列が API キーです。後ほどコードに貼り付けるため、コピーしておきましょう。

ショートカットURL: 以下の URL の xxxx をあなたのスペース ID(ドメイン)に書き換えることで、直接設定画面にアクセスできます。

https://xxxx.backlog.com/EditApiSettings.action

Project ID の確認

次に、操作対象となるプロジェクトの ID を確認します。

  1. 対象のプロジェクトを開き、左メニューの [プロジェクト設定] をクリックします。
  2. その画面を開いた状態で、ブラウザの アドレスバー(URL) を確認してください。
  3. URL の末尾にある project.id=XXXXXX の数字部分が Project ID です。

API によっては「プロジェクトキー(例: PROJ)」でも動作しますが、今回は確実な「Project ID(数字)」を使用します。

実践

課題一覧データを取得する(基本編)

ここからは実際のプログラミング作業に入ります。 API との通信には、Python の標準的なライブラリである requests を使用します。

Python環境とRequestsライブラリの準備

まだインストールしていない場合は、以下のコマンドでライブラリを追加してください。

pip install requests

全件取得のサンプルコード

まずは、指定したプロジェクトの課題一覧をシンプルに取得し、画面に表示するスクリプトです。 以下のコードをコピーし、YOUR_API_KEYYOUR_SPACE_ID(ドメイン部分)、PROJECT_ID を書き換えて実行してみてください。

import requests
import pprint

def main():
    # 環境に合わせて書き換えてください
    API_KEY = 'YOUR_API_KEY'       # 取得したAPIキー
    SPACE_ID = 'xxxxx'             # スペースID (https://xxxxx.backlog.com の xxxxx部分)
    PROJECT_ID = 12345             # 確認したプロジェクトID(数値)

    # APIのエンドポイントとパラメータ設定
    url = f'https://{SPACE_ID}.backlog.com/api/v2/issues'
    payload = {
        'apiKey': API_KEY,
        'projectId[]': [PROJECT_ID], # 配列で指定する必要がある点に注意
    }

    try:
        # APIリクエストを実行
        response = requests.get(url, params=payload)
        response.raise_for_status() # エラーがあれば例外を発生させる

        # 結果をJSONとして取得し、表示
        issues = response.json()
        pprint.pprint(issues)

    except requests.exceptions.RequestException as e:
        print(f"エラーが発生しました: {e}")

if __name__ == '__main__':
    main()

実行結果(イメージ)

成功すると、以下のような JSON 形式(辞書型リスト)のデータが大量に出力されます。 これが Backlog が持っている「課題」の生データです。

[{'actualHours': None,
  'assignee': {'id': 123456, 'name': '山田 太郎', ...},
  'attachments': [],
  'created': '2023-10-27T08:00:00Z',
  'createdUser': {'id': 123456, ...},
  'description': '課題の詳細内容です...',
  'dueDate': '2023-11-30T00:00:00Z',
  'estimatedHours': None,
  'id': 1073892456,
  'issueKey': 'PROJ-123',
  'issueType': {'color': '#7ea800', 'id': 567890, 'name': 'タスク', ...},
  'milestone': [],
  'priority': {'id': 3, 'name': '中'},
  'projectId': 12345,
  'status': {'id': 1, 'name': '未対応'},
  'summary': '定例会議の資料作成',
  ...(以下省略)...
}]

このままでは情報量が多すぎて人間には読みづらいですね。 次のステップでは、ここから「本当に必要な情報」だけを抜き出して、見やすい CSV ファイルに変換します。

実践

条件を絞り込んで CSV 出力する(応用編)

全件取得ができたら、次は「必要なデータだけ」を抽出してみましょう。 実務では「期限切れの課題」や「優先度が高いのに放置されている課題」をリストアップしたいケースがほとんどだからです。

「未完了」かつ「高優先度」の課題を抽出するロジック

Backlog API は、リクエスト時にパラメータ(条件)を渡すことで、サーバー側でデータを絞り込んで返してくれます。 今回は以下の条件を指定します。

  • ステータス: 「完了(ID:4)」以外 → つまり未対応(1)、処理中(2)、処理済み(3)を指定
  • 優先度: 「高(ID:2)」

実務で使える CSV 出力コード

以下のコードは、条件に合致する課題を取得し、Excel でそのまま開ける CSV ファイル(BOM 付き UTF-8)として保存します。

import csv
import requests

def main():
    # -------------------------------------------------
    # 設定エリア(ここを環境に合わせて書き換えてください)
    # -------------------------------------------------
    API_KEY = 'YOUR_API_KEY'
    SPACE_ID = 'xxxxx'         # スペースID
    PROJECT_ID = 12345         # プロジェクトID
    OUTPUT_FILE = 'high_priority_issues.csv'
    # -------------------------------------------------

    url = f'https://{SPACE_ID}.backlog.com/api/v2/issues'

    # フィルタ条件の設定
    payload = {
        'apiKey': API_KEY,
        'projectId[]': [PROJECT_ID],
        'statusId[]': [1, 2, 3],   # 1:未対応, 2:処理中, 3:処理済み (4:完了 は除外)
        'priorityId[]': [2],       # 2:高
        'sort': 'dueDate',         # 期限日でソート
        'order': 'asc',            # 昇順(期限が近い順)
        'count': 100               # 一度に取得する件数(最大100)
    }

    try:
        response = requests.get(url, params=payload)
        response.raise_for_status()
        issues = response.json()

        if not issues:
            print("条件に一致する課題はありませんでした。")
            return

        # CSV出力処理
        # encoding='utf_8_sig' は Excel での文字化けを防ぐおまじないです
        with open(OUTPUT_FILE, 'w', encoding='utf_8_sig', newline='') as f:
            # ヘッダー(列名)の定義
            fieldnames = ['課題キー', '件名', '担当者', 'ステータス', '期限日', '詳細URL']
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()

            # データの書き込み
            for issue in issues:
                # 担当者が未設定の場合のエラー回避
                assignee_name = issue['assignee']['name'] if issue['assignee'] else '(未設定)'
                
                writer.writerow({
                    '課題キー': issue['issueKey'],
                    '件名': issue['summary'],
                    '担当者': assignee_name,
                    'ステータス': issue['status']['name'],
                    '期限日': issue['dueDate'] if issue['dueDate'] else '(指定なし)',
                    '詳細URL': f"https://{SPACE_ID}.backlog.com/view/{issue['issueKey']}"
                })

        print(f"完了! '{OUTPUT_FILE}' に {len(issues)} 件の課題を出力しました。")

    except requests.exceptions.RequestException as e:
        print(f"エラーが発生しました: {e}")

if __name__ == '__main__':
    main()

コードのポイント:

payload で条件指定

statusId[]priorityId[] をリスト形式で渡すことで、複数の条件を組み合わせて検索できます。

utf_8_sig

Windows の Excel は標準の UTF-8 を開くと文字化けすることがありますが、utf_8_sig(BOM付き)を指定することでこれを回避しています。これで Shift-JIS 変換の手間は不要です。

まとめ

本記事では、Python を使って Backlog API を操作し、特定の条件の課題を抽出して CSV 化する方法を解説しました。

  • API キーとプロジェクト ID があれば、誰でも簡単にデータにアクセスできる。
  • Requests ライブラリ を使えば、わずか数行で Backlog のデータを取得できる。
  • パラメータ を活用することで、「未完了」「高優先度」などのフィルタリングも自動化できる。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次