Skip to main content

API を使用して Projects を管理する

GraphQL API を使用して、プロジェクトを自動化できます。

Tool navigation

この記事では、GraphQL API を使用してプロジェクトを管理する方法を説明します。 GitHub Actions ワークフローでの API の使い方の詳細については、「Actions を使用した Projects の自動化」を参照してください。 使用可能なデータ型の完全な一覧については、「関連項目」を参照してください。

認証

次のすべての curl コマンドの例では、TOKEN を、read:project スコープ (クエリの場合) または project スコープ (クエリとミューテーションの場合) を持つトークンに置き換えます。 このトークンは、ユーザーのpersonal access token (classic)でも、GitHub App のインストール アクセス トークンでもかまいません。 personal access tokenの作成の詳細については、「個人用アクセス トークンを管理する」を参照してください。 GitHub App のインストール アクセス トークンの作成の詳細については、「GitHub アプリのインストール アクセス トークンの生成」を参照してください。

GitHub App にインストール アクセス トークンを使用する場合、一部の GraphQL ミューテーションには追加のアクセス許可が必要になります。 たとえば、createProjectV2 ミューテーションを使用する際に repositoryId 入力パラメーターを指定する場合は、プロジェクトをターゲット リポジトリにリンクするために、そのリポジトリの Contents アクセス許可も必要です。

プロジェクトに関する情報を見つける

プロジェクトに関するデータを取得するには、クエリを使ってください。 詳しくは、「GraphQLでの呼び出しの作成」をご覧ください。

OrganizationプロジェクトのノードIDを調べる

APIを通じてプロジェクトを更新するには、プロジェクトのノードIDを知る必要があります。

Organization名とプロジェクト番号が分かっていれば、OrganizationプロジェクトのノードIDを知ることができます。 ORGANIZATION を自身の組織の名前に置き換えます。 たとえば、「 octo-org 」のように入力します。 NUMBER をプロジェクト番号に置き換えます。 プロジェクト番号を見つけるには、プロジェクトのURLを見てください。 たとえば、https://github.com/orgs/octo-org/projects/5 のプロジェクト番号は 5 です。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{organization(login: \"ORGANIZATION\") {projectV2(number: NUMBER){id}}}"}'

Organization中のすべてのプロジェクトのノードIDを見つけることもできます。 以下の例は、Orgazation中の最初の20個のプロジェクトのノードIDとタイトルを返します。 ORGANIZATION を自身の組織の名前に置き換えます。 たとえば、「 octo-org 」のように入力します。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"{organization(login: \"ORGANIZATION\") {projectsV2(first: 20) {nodes {id title}}}}"}'

ユーザプロジェクトのノードIDを調べる

APIを通じてプロジェクトを更新するには、プロジェクトのノードIDを知る必要があります。

ユーザプロジェクトのノードIDは、プロジェクト番号を知っていれば見つけることができます。 USER は、実際のユーザー名に置き換えます。 たとえば、「 octocat 」のように入力します。 NUMBERをプロジェクト番号に置き換えます。 プロジェクト番号を見つけるには、プロジェクトのURLを見てください。 たとえば、https://github.com/users/octocat/projects/5 のプロジェクト番号は 5 です。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{user(login: \"USER\") {projectV2(number: NUMBER){id}}}"}'

自分のすべてのプロジェクトのノードIDを知ることもできます。 以下の例では、自分の最初の20個のプロジェクトのノードIDとタイトルが返されます。 USER をご自分のユーザー名に置き換えます。 たとえば、octocat のようにします。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"{user(login: \"USER\") {projectsV2(first: 20) {nodes {id title}}}}"}'

フィールドのノードIDを見つける

フィールドの値を更新するには、フィールドのノードIDを知る必要があります。 加えて、単一選択フィールドの選択肢のIDと、繰り返しフィールドの繰り返しのIDも知る必要があります。

以下の例では、プロジェクト内の最初の 20 個のフィールドの ID、名前、設定、構成が返されます。 PROJECT_ID はプロジェクトのノード ID に置き換えます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{ node(id: \"PROJECT_ID\") { ... on ProjectV2 { fields(first: 20) { nodes { ... on ProjectV2Field { id name } ... on ProjectV2IterationField { id name configuration { iterations { startDate id }}} ... on ProjectV2SingleSelectField { id name options { id name }}}}}}}"}'

応答は、次の例のようになります。

{
  "data": {
    "node": {
      "fields": {
        "nodes": [
          {
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZY",
            "name": "Title"
          },
          {
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZc",
            "name": "Assignees"
          },
          {
            "id": "PVTSSF_lADOANN5s84ACbL0zgBZrZg",
            "name": "Status",
            "options": [
              {
                "id": "f75ad846",
                "name": "Todo"
              },
              {
                "id": "47fc9ee4",
                "name": "In Progress"
              },
              {
                "id": "98236657",
                "name": "Done"
              }
            ]
          },
          {
            "id": "PVTIF_lADOANN5s84ACbL0zgBah28",
            "name": "Iteration",
            "configuration": {
              "iterations": [
                {
                  "startDate": "2022-05-29",
                  "id": "cfc16e4d"
                }
              ]
            }
          }
        ]
      }
    }
  }
}

各フィールドには ID と名前があります。 単一選択フィールドは ProjectV2SingleSelectField オブジェクトとして返され、単一選択の各オプションの ID を見つけることができる options フィールドがあります。 繰り返しフィールドは ProjectV2IterationField オブジェクトとして返され、ID と各繰り返しに関する情報が含まれている iterations フィールドを含む configuration フィールドがあります。

フィールドの名前と ID のみが必要で、繰り返しや単一選択フィールドのオプションに関する情報が必要ない場合は、ProjectV2FieldCommon オブジェクトを利用できます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{ node(id: \"PROJECT_ID\") { ... on ProjectV2 { fields(first: 20) { nodes { ... on ProjectV2FieldCommon { id name }}}}}}"}'

ProjectV2FieldCommon オブジェクトを使用する場合の応答は、次の例のようになります。

{
  "data": {
    "node": {
      "fields": {
        "nodes": [
          {
            "__typename": "ProjectV2Field",
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZY",
            "name": "Title"
          },
          {
            "__typename": "ProjectV2Field",
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZc",
            "name": "Assignees"
          },
          {
            "__typename": "ProjectV2SingleSelectField",
            "id": "PVTSSF_lADOANN5s84ACbL0zgBZrZg",
            "name": "Status"
          },
          {
            "__typename": "ProjectV2IterationField",
            "id": "PVTIF_lADOANN5s84ACbL0zgBah28",
            "name": "Iteration"
          }
        ]
      }
    }
  }
}

プロジェクト中のアイテムに関する情報を見つける

APIでクエリを行い、プロジェクト中のアイテムに関する情報を見つけることができます。

次の例では、プロジェクトの最初の 20 件の issue、pull request、ドラフト issue が返されます。 issue と pull request の場合は、タイトルと最初の 10 人の担当者も返されます。 ドラフト issue の場合は、タイトルと本文が返されます。 この例では、プロジェクトの最初の 8 つのフィールドのテキスト、日付、または単一選択フィールドのフィールド名と値も返されます。 PROJECT_ID はプロジェクトのノード ID に置き換えます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{ node(id: \"PROJECT_ID\") { ... on ProjectV2 { items(first: 20) { nodes{ id fieldValues(first: 8) { nodes{ ... on ProjectV2ItemFieldTextValue { text field { ... on ProjectV2FieldCommon { name }}} ... on ProjectV2ItemFieldDateValue { date field { ... on ProjectV2FieldCommon { name } } } ... on ProjectV2ItemFieldSingleSelectValue { name field { ... on ProjectV2FieldCommon { name }}}}} content{ ... on DraftIssue { title body } ...on Issue { title assignees(first: 10) { nodes{ login }}} ...on PullRequest { title assignees(first: 10) { nodes{ login }}}}}}}}}"}'

プロジェクトは、ユーザが表示権限を持たないアイテムを含んでいることがあります。 この場合、アイテムの種類は REDACTED として返されます。

プロジェクトの更新

プロジェクトを更新するには、ミューテーションを使ってください。 詳しくは、「GraphQLでの呼び出しの作成」をご覧ください。

Note

同じ呼び出しで項目を追加および更新することはできません。 addProjectV2ItemById を使用して項目を追加してから、updateProjectV2ItemFieldValue を使用して項目を更新する必要があります。

プロジェクトへのアイテムの追加

以下の例は、プロジェクトにIssueあるいはPull Requestを追加します。 PROJECT_ID はプロジェクトのノード ID に置き換えます。 CONTENT_ID は、追加する Issue または Pull Request のノード ID に置き換えます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {addProjectV2ItemById(input: {projectId: \"PROJECT_ID\" contentId: \"CONTENT_ID\"}) {item {id}}}"}'

レスポンスには、新しく作成されたアイテムのノードIDが含まれます。

{
  "data": {
    "addProjectV2ItemById": {
      "item": {
        "id": "PVTI_lADOANN5s84ACbL0zgBVd94"
      }
    }
  }
}

既に存在しているアイテムを追加しようとすると、代わりに既存のアイテムのIDが返されます。

プロジェクトへのドラフト issue の追加

次の例では、プロジェクトにドラフト issue を追加します。 PROJECT_ID はプロジェクトのノード ID に置き換えます。 TITLEBODY は、新しいドラフト issue に必要なコンテンツに置き換えます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {addProjectV2DraftIssue(input: {projectId: \"PROJECT_ID\" title: \"TITLE\" body: \"BODY\"}) {projectItem {id}}}"}'

応答には、新しく作成されたドラフト issue のノード ID が含まれます。

{
  "data": {
    "addProjectV2DraftIssue": {
      "projectItem": {
        "id": "PVTI_lADOANN5s84ACbL0zgBbxFc"
      }
    }
  }
}

プロジェクトの設定の更新

以下の例は、プロジェクトの設定を更新します。 PROJECT_ID はプロジェクトのノード ID に置き換えます。 publictrue に設定して、プロジェクトを GitHub 上で公開します。 readme を変更し、プロジェクトの README に変更を加えます。

curl --request POST \
--url https://api.github.com/graphql \
--header 'Authorization: Bearer TOKEN' \
--data '{"query":"mutation { updateProjectV2(input: { projectId: \"PROJECT_ID\", title: \"Project title\", public: false, readme: \"# Project README\n\nA long description\", shortDescription: \"A short description\"}) { projectV2 { id, title, readme, shortDescription }}}"}'

カスタムのテキスト、数値、日付フィールドの更新

以下の例では、アイテムのテキスト フィールドの値を更新します。 PROJECT_ID はプロジェクトのノード ID に置き換えます。 ITEM_ID は、更新する項目のノード ID に置き換えます。 FIELD_ID は、更新するフィールドの ID に置き換えます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {updateProjectV2ItemFieldValue( input: { projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\" fieldId: \"FIELD_ID\" value: { text: \"Updated text\" }}) { projectV2Item { id }}}"}'

Note

updateProjectV2ItemFieldValue を使用して AssigneesLabelsMilestoneRepository を変更することはできません。これらのフィールドは、プロジェクト項目ではなく、pull request と issue のプロパティであるためです。 代わりに、次のミューテーションを使用できます。

単一選択フィールドの更新

以下の例は、アイテムの単一選択フィールドの値を更新します。

  • PROJECT_ID - これをプロジェクトのノード ID に置き換えます。
  • ITEM_ID - これを、更新する項目のノード ID に置き換えます。
  • FIELD_ID - これを、更新する単一選択フィールドの ID に置き換えます。
  • OPTION_ID - これを、目的の単一選択オプションの ID に置き換えます。
curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {updateProjectV2ItemFieldValue( input: { projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\" fieldId: \"FIELD_ID\" value: { singleSelectOptionId: \"OPTION_ID\" }}) { projectV2Item { id }}}"}'

繰り返しフィールドの更新

以下の例は、アイテムの繰り返しフィールドの値を更新します。

  • PROJECT_ID - これをプロジェクトのノード ID に置き換えます。
  • ITEM_ID - これを、更新する項目のノード ID に置き換えます。
  • FIELD_ID - これを、更新する繰り返しフィールドの ID に置き換えます。
  • ITERATION_ID - これを、目的の繰り返しの ID に置き換えます。 これは、アクティブなまたは完了した繰り返しにすることができます。
curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {updateProjectV2ItemFieldValue( input: { projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\" fieldId: \"FIELD_ID\" value: { iterationId: \"ITERATION_ID\" }}) { projectV2Item { id }}}"}'

プロジェクトからのアイテムの削除

以下の例は、プロジェクトからアイテムを削除します。 PROJECT_ID はプロジェクトのノード ID に置き換えます。 ITEM_ID は、削除する項目のノード ID に置き換えます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {deleteProjectV2Item(input: {projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\"}) {deletedItemId}}"}'

プロジェクトを管理する

プロジェクトの作成

ミューテーションを使って、新しいプロジェクトを作成できます。 詳しくは、「GraphQLでの呼び出しの作成」をご覧ください。

API を使って新しいプロジェクトを作成するには、プロジェクトの名前と、プロジェクトの所有者となる GitHub ユーザーまたは organization のノード ID を指定する必要があります。

ユーザー名がわかっている場合は、GitHub ユーザーまたは organization のノード ID を確認できます。 GITHUB_OWNER を、新しいプロジェクト所有者の GitHub ユーザー名に置き換えます。

curl --request GET \
  --url https://api.github.com/users/GITHUB_OWNER \
  --header 'Authorization: token TOKEN' \
  --header 'Accept: application/vnd.github+json'

プロジェクトを作成するには、OWNER_ID を新しいプロジェクト所有者のノード ID に置き換え、PROJECT_NAME をプロジェクトの名前に置き換えます。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: token TOKEN' \
  --data '{"query":"mutation {createProjectV2(input: {ownerId: \"OWNER_ID\" title: \"PROJECT_NAME\"}) {projectV2 {id}}}"}'

Webhook の使用

Webhook を使用して、プロジェクトで発生するイベントをサブスクライブできます。 たとえば、項目が編集されると、GitHub から Webhook の構成済み URL に HTTP POST ペイロードが送信されます。これにより、サーバー上で自動化をトリガーできます。 Webhook の詳細については、「webhook について」を参照してください。 projects_v2_item Webhook イベントの詳細については、「Webhook のイベントとペイロード」を参照してください。