👶

GitHub GraphQL APIでProjectsのカードを取得する

2023/12/05に公開

はじめに

かんばんツールをTrelloからGitHub Projectsへ引っ越した際に、
GraphQL APIについてもいろいろ調べたのでその一部を書きます。
公式ドキュメントを見ながら作業しましたが、
今回記載したのはごく一部の例なので、
詳しい仕様の確認やカスタマイズの際は参考にして下さい。

書くこと

  • カード情報を取得するクエリについて

書かないこと

  • アクセストークンの発行やエンドポイントなど基本的な手順
  • カード登録に関連すること

カードを取得するための手順

Step1 プロジェクトIDの取得

まずはプロジェクトIDを取得します。
以下のクエリで取得出来る
PVT_xxxxxxxxxxxxxx みたいなのがGraphQL APIを使う上で使うプロジェクトIDです。

query { 
    organization(login: "{組織名}") {
        projectV2(number: {プロジェクトナンバー}) {
          id
        }
    }
}

※{}の部分は、URLのこの部分

github.com/orgs/{組織名}/projects/{プロジェクトナンバー}/views/1

レスポンスはこんな感じ

{
  "data": {
    "organization": {
      "projectV2": {
        "id": "PVT_xxxxxxxxxxxxxx"
      }
    }
  }
}

Step2 すべてのカードの情報を取得する

{
  node(id: "{プロジェクトID}") {
    ... on ProjectV2 {
      items(first: 100) {      #カードを100個まで取得
        nodes {              #カードの中身で取得したいものを書く
          id                    #カード自体のID
          fieldValues(first: 20) { #カードに定義されたフィールドの情報
            nodes { #取得したいフィールドについて書く
              ... on ProjectV2ItemFieldTextValue {
                field {
                  ... on ProjectV2FieldCommon {
                    name #フィールドの名前
                  }
                }
                text
              }
              ... on ProjectV2ItemFieldUserValue { #Assigneesのフィールド
                field {
                  ... on ProjectV2FieldCommon {
                    name
                  }
                }
                users(first: 10) {
                  nodes {
                    id  #U_xxxxxxxxxx的なやつ
                    login #我々がよく目にするアカウントID
                  }
                }
              }
              ... on ProjectV2ItemFieldSingleSelectValue { #選択項目(Statusとか)
                name #選択されてる名称
                field {
                  ... on ProjectV2FieldCommon {
                    name
                  }
                }
              }
              ... on ProjectV2ItemFieldNumberValue { #数値項目
                field {
                  ... on ProjectV2FieldCommon {
                    name
                  }
                }
                number #入力値
              }
            }
          }
        }
      }
    }
  }
}

デモ

こんな感じのプロジェクトから全カードを取得してみます

取得結果

{
  "data": {
    "node": {
      "items": {
        "nodes": [
          {
            "id": "PVTI_xxxxxxxxxxxxxxxxxxxxx",
            "fieldValues": {
              "nodes": [
                {
                  "field": {
                    "name": "Title"
                  },
                  "text": "Todoのタスク"
                },
                {
                  "name": "Todo",
                  "field": {
                    "name": "Status"
                  }
                },
                {
                  "field": {
                    "name": "MEMO"
                  },
                  "text": "Todoのタスクのメモ"
                }
              ]
            }
          },
          {
            "id": "PVTI_xxxxxxxxxxxxxxxxxxxxx",
            "fieldValues": {
              "nodes": [
                {
                  "field": {
                    "name": "Title"
                  },
                  "text": "進行中のタスク"
                },
                {
                  "name": "In Progress",
                  "field": {
                    "name": "Status"
                  }
                },
                {
                  "field": {
                    "name": "MEMO"
                  },
                  "text": "進行中タスクのメモ"
                }
              ]
            }
          },
          {
            "id": "PVTI_xxxxxxxxxxxxxxxxxxxxx",
            "fieldValues": {
              "nodes": [
                {
                  "field": {
                    "name": "Title"
                  },
                  "text": "完了したタスク"
                },
                {
                  "name": "Done",
                  "field": {
                    "name": "Status"
                  }
                },
                {
                  "field": {
                    "name": "MEMO"
                  },
                  "text": "完了タスクのメモ"
                }
              ]
            }
          }
        ]
      }
    }
  }
}

簡単ですが、以上です。
上記クエリは一例なので、取得したいフィールドを増やしたりすることももちろん可能です。

カードの登録や、カスタムフィールドへの値設定なども機会があれば書きたいと思います。

BABYJOB テックブログ

Discussion