Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022
Analytics OData クエリを使用して、ブラウザーまたは Excel や Power BI などのクライアント ツールで Azure DevOps から作業追跡データを取得します。 この記事では、アイテムのカウント、 $selectを使用した特定のフィールドの選択、 $filterによるフィルター処理、 $expandを使用したナビゲーション プロパティの展開、日付範囲のクエリ、 $orderbyによる並べ替えについて説明します。
ヒント
この記事の後半でAI を使用してこのタスクに役立てる方法をご説明します。または、Azure DevOps MCP Server で AI サポートを有効にする方法を参照して作業を開始できます。
この例では、Azure Boards の作業追跡エンティティ セットに焦点を当てていますが、他のエンティティ セットにも同じ原則が適用されます。 詳細については、「Azure Boards Analytics の分析とメタデータに関する OData クエリの構築」を参照してください。
注
Analytics サービスは、Azure DevOps Services 内のすべてのサービスに対して運用環境で自動的に有効になり、サポートされます。 Power BI の統合 と、Analytics サービスの OData フィード へのアクセスが一般公開されています。 Analytics OData フィードを使用し、フィードバックを提供することをお勧めします。
使用可能なデータはバージョンによって異なります。 OData API のサポートされている最新バージョンが v2.0され、最新のプレビュー バージョンが v4.0-preview。 詳細については、 OData API のバージョン管理に関するページを参照してください。
注
Analytics サービスは、Azure DevOps Server 2020 以降のすべての新しいプロジェクト コレクションに対して、運用環境で自動的にインストールされ、サポートされます。 Power BI の統合 と、Analytics サービスの OData フィード へのアクセスが一般公開されています。 Analytics OData フィードを使用し、フィードバックを提供することをお勧めします。 Azure DevOps Server 2019 からアップグレードする場合は、アップグレード中に Analytics サービスをインストールできます。
使用可能なデータはバージョンによって異なります。 OData API のサポートされている最新バージョンが v2.0され、最新のプレビュー バージョンが v4.0-preview。 詳細については、 OData API のバージョン管理に関するページを参照してください。
前提条件
| カテゴリ | 要求事項 |
|---|---|
| アクセス レベル |
-
プロジェクト メンバー。 - 少なくともベーシックアクセス。 |
| アクセス許可 | 既定では、プロジェクト メンバーには Analytics にクエリを実行してビューを作成する権限があります。 サービスと機能の有効化と一般的なデータ追跡アクティビティに関するその他の前提条件の詳細については、「 Analytics にアクセスするためのアクセス許可と前提条件を参照してください。 |
注
- プロジェクト間クエリは、クエリを実行しているユーザーがすべてのプロジェクトにアクセスできない場合に失敗します。 詳細については、「 Project クエリと組織スコープクエリ」を参照してください。
- この記事の例では、Azure DevOps Services の URL 形式 (
https://analytics.dev.azure.com/{OrganizationName}/) を使用します。 Azure DevOps Server の場合は、代わりにhttps://{servername}/{CollectionName}/を使用します。 詳細については、「 Analytics の OData クエリを作成する」を参照してください。
アイテムの数を取得する
他のデータなしでカウントのみを返すには、エンティティ セットの URL に $apply=aggregate($count as Count) を追加します。 たとえば、次のクエリでは、組織全体のプロジェクト、作業項目、エリア パス、ユーザーがカウントされます。
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Projects?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/WorkItems?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Areas?$apply=aggregate($count as Count)
https://analytics.dev.azure.com/<OrganizationName>/_odata/v4.0-preview/Users?$apply=aggregate($count as Count)
Projects組織のfabrikam クエリは、次を返します。
{
"value": [
{
"Count": 16
}
]
}
アイテムとそのデータの数を取得する
データと共にカウントを返すには、$count=true句を含むクエリに$selectを追加します。 次のクエリは、プロジェクト内の作業項目、エリア パス、およびユーザーのカウントと選択したプロパティを返します。
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/WorkItems?$count=true&$select=WorkItemId,Title,WorkItemType
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/Areas?$count=true&$select=AreaName,AreaPath
https://analytics.dev.azure.com/<OrganizationName>/<ProjectName>/_odata/v4.0-preview/Users?$count=true&$select=UserName,UserEmail
注
クエリには常に $select または $apply を含めます。 両方を省略すると警告がトリガーされ、使用制限に達する可能性があります。
有効なプロパティ名については、「 Azure Boards Analytics のメタデータ リファレンス 」と 「カレンダーの日付、プロジェクト、およびユーザーメタデータリファレンス」を参照してください。
たとえば、次のクエリでは 、Fabrikam Fiber プロジェクトのカウントとユーザー名が返されます。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Users?$count=true&$select=UserName
応答には、 @odata.count の合計数と、一致するレコードが valueに含まれます。
{
"@odata.count": 5,
"value": [
{ "UserName": "Microsoft.VisualStudio.Services.TFS" },
{ "UserName": "fabrikamfiber1@hotmail.com" },
{ "UserName": "Jamal Hartnett" },
{ "UserName": "fabrikamfiber5@hotmail.com" },
{ "UserName": "fabrikamfiber2@hotmail.com" }
]
}
特定のプロパティまたはフィールドを選択する
$select句を追加して、必要なプロパティのみを返します。 プロパティ名では大文字と小文字が区別され、スペースを含めず、作業項目のフィールド名に対応します。 たとえば、 $select=WorkItemId,WorkItemType,Title,State はこれら 4 つのフィールドを返します。
カスタム フィールドを含むプロパティ名の参照については、 Azure Boards のメタデータ リファレンスを参照してください。
次のクエリは、Fabrikam Fiber プロジェクトの上位 3 つの作業項目の ID、種類、タイトル、および状態を返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$top=3
{
"value": [
{ "WorkItemId": 31, "Title": "About screen", "WorkItemType": "Task", "State": "New" },
{ "WorkItemId": 30, "Title": "Change background color", "WorkItemType": "Task", "State": "Active" },
{ "WorkItemId": 32, "Title": "Standardize on form factors", "WorkItemType": "Task", "State": "Active" }
]
}
データのフィルター処理
特定の条件に一致する項目のみを返す $filter 句を追加します。
eq、ne、gt、ge、lt、leなどの比較演算子を使用し、条件をandとorと組み合わせます。 たとえば、次のクエリは進行中の機能を返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,Title,AssignedTo,State&$filter=WorkItemType eq 'Feature' and State eq 'In Progress'
複数のフィルター条件を結合する
かっこを使用して、or条件をより広範なandフィルター内でグループ化します。 次のクエリは、特定の状態のユーザー ストーリー、バグ、およびカスタム型を返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,Title,AssignedTo,State&$filter=(WorkItemType eq 'User Story' or WorkItemType eq 'Bug' or WorkItemType eq 'Backlog Work') and (State eq 'New' or State eq 'Committed' or State eq 'Active')
{
"value": [
{ "WorkItemId": 210, "Title": "Slow response on form", "State": "Active" },
...
{ "WorkItemId": 160, "Title": "Game store testing", "State": "New" }
]
}
フィルター式では、 contains、 startswith、 endswith などの文字列関数を使用することもできます。 詳細については、「 サポートされている関数」を参照してください。
クエリ領域のパスまたは反復パスのプロパティ
一部のクエリでは、パス文字列ではなく代理キー (AreaSK または IterationSK) が必要です。
Areas または Iterations エンティティ セットを使用して、特定のパスのキーを検索します。
特定のエリア パスの AreaSK を返します
次のクエリは、Fabrikam Fiber\Production Planning\Webエリア パスのAreaSK を返します。 その他の使用可能なプロパティについては、「 区分」を参照してください。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Areas?$filter=AreaPath eq 'Fabrikam Fiber\Production Planning\Web'&$select=AreaSK
{
"value": [
{ "AreaSK": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" }
]
}
特定のイテレーション パスの IterationSK を返します
次のクエリは、Fabrikam Fiber\Release 1\Sprint 3イテレーション パスに対するIterationSKを返します。 その他の使用可能なプロパティについては、「 イテレーション」を参照してください。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/Iterations?$filter=IterationPath eq 'Fabrikam Fiber\Release 1\Sprint 3'&$select=IterationSK
ナビゲーション プロパティでフィルター処理する
Iteration、Area、AssignedToなどのナビゲーション プロパティは、他のエンティティとのリレーションシップを表します。 関連エンティティからフィールドをフィルター処理するには、 NavigationProperty/Field形式の完全なパスを使用します。 たとえば、Iteration/IterationPathは、IterationPath ナビゲーション プロパティを使用してIteration フィールドを参照します。
/WorkItems?$filter=Iteration/IterationPath eq 'Project Name\Iteration 1'
次のクエリは、完全なナビゲーション パスを使用して、特定のイテレーションの上位 5 つの作業項目を返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$top=5&$filter=Iteration/IterationPath eq 'Fabrikam Fiber\3Week Sprints\Sprint 3'&$select=WorkItemId,WorkItemType,Title,State&$orderby=WorkItemId asc
関連エンティティからデータを展開する
ナビゲーション プロパティによるフィルター処理では、そのデータは応答に含まれません。 関連エンティティからフィールドを返すには、 $expandを使用します。
$expandがないと、$selectを介してナビゲーション プロパティ フィールドにアクセスすることはできません。
次のクエリは、展開された480 エンティティのすべてのフィールドを含む作業項目Iterationを返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration
$select展開にはIterationが適用されないため、応答にはすべてのIterationフィールドが含まれます。
{
"value": [
{
"WorkItemId": 480,
"Title": "Add animated emoticons",
"WorkItemType": "User Story",
"State": "New",
"Iteration": {
"ProjectSK": "bbbbbbbb-1111-2222-3333-cccccccccccc",
"IterationSK": "cccccccc-2222-3333-4444-dddddddddddd",
"IterationName": "Sprint 3",
"IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3",
"StartDate": "2025-12-04T00:00:00-12:00",
"EndDate": "2025-12-25T23:59:59.999-12:00",
"IterationLevel1": "Fabrikam Fiber",
"IterationLevel2": "3Week Sprints",
"IterationLevel3": "Sprint 3",
...
"Depth": 2,
"IsEnded": false
}
}
]
}
expand ステートメントで select を使用する
展開されたエンティティから返されるフィールドを制限するには、構文$selectを使用して$expand内に$expand=Entity($select=Field1,Field2)句を追加します。 次のクエリは Iteration を展開しますが、 IterationName と IterationPathのみを返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($select=IterationName,IterationPath)
{
"value": [
{
"WorkItemId": 480,
"Title": "Add animated emoticons",
"WorkItemType": "User Story",
"State": "New",
"Iteration": {
"IterationName": "Sprint 3",
"IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3"
}
}
]
}
次の表は、一般的なナビゲーション プロパティの種類の例を$expand$selectと共に示しています。
| ナビゲーションの種類 | キープロパティ | 句の例 |
|---|---|---|
| 日付と時間 | DateSK |
$expand=CreatedDate($select=Date) または$expand=CreatedDate($select=WeekStartingDate) |
| アイデンティティ | UserSK |
$expand=AssignedTo($select=UserName) または$expand=AssignedTo($select=UserEmail) |
| エリア | AreaSK |
$expand=Area($select=AreaName) または$expand=Area($select=AreaPath) |
| イテレーション | IterationSK |
$expand=Iteration($select=IterationName) または$expand=Iteration($select=IterationPath) または$expand=Iteration($select=StartDate) |
| プロジェクト | ProjectSK |
$expand=Project($select=ProjectName) |
| チーム | TeamSK |
$expand=Teams($select=TeamName) |
1 つのクエリで複数のナビゲーション プロパティを展開するには、コンマ区切りのリストを使用します。
$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath)
入れ子になった expand ステートメントを使用する
既に展開されているエンティティ内でナビゲーション プロパティを展開するには、1 つの $expand を別のエンティティ内に入れ子にします。 次のクエリでは、Iterationを展開し、Project内のIterationを展開して、イテレーションが属するプロジェクトを表示します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($expand=Project)
入れ子になった展開と$selectを組み合わせるには、セミコロン (;) を使用して、かっこ内の$selectから$expandを区切ります。 セミコロンを指定しないと、クエリはエラーを返します。 次のクエリは、IterationNameからIterationPathとIterationと入れ子になったProjectのみを返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$filter=WorkItemId eq 480&$select=WorkItemId,WorkItemType,Title,State&$expand=Iteration($select=IterationName,IterationPath;$expand=Project)
{
"value": [
{
"WorkItemId": 480,
"Title": "Add animated emoticons",
"WorkItemType": "User Story",
"State": "New",
"Iteration": {
"IterationName": "Sprint 3",
"IterationPath": "Fabrikam Fiber\\3Week Sprints\\Sprint 3",
"Project": {
"ProjectSK": "bbbbbbbb-1111-2222-3333-cccccccccccc",
"ProjectName": "Fabrikam Fiber"
}
}
}
]
}
日付範囲のクエリを実行する
次のクエリ例は、最後の 変更日 が 2025 年 1 月 1 日以上の作業項目を返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$filter=ChangedDate ge 2025-01-01Z
次のクエリ例は、2025 年 10 月 31 日から 11 月 7 日の週に最後の 変更日 が発生した作業項目を返します。
https://analytics.dev.azure.com/fabrikam/Fabrikam%20Fiber/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State&$filter=ChangedDate ge 2025-10-31Z and ChangedDate le 2025-11-07Z
結果を並べ替える
$orderbyを追加して、1 つ以上のプロパティで結果を並べ替えます。 既定では、結果は昇順で並べ替えられます。降順の desc を追加します。 複数の並べ替えフィールドをコンマで区切ります。
| 並べ替え順 | 条項 |
|---|---|
| 作業アイテム ID | /WorkItems?$orderby=WorkItemId |
| 作業項目 ID (最新順) | /WorkItems?$orderby=WorkItemId desc |
| 作業項目の種類、状態 | /WorkItems?$orderby=WorkItemType,State |
AI を使用して OData クエリを作成する
Azure DevOps MCP Server を構成する場合は、AI アシスタントを使用して OData クエリの構築とトラブルシューティングを行うことができます。
プロンプトの例
| Task | プロンプトの例 |
|---|---|
| クエリを作成する | Write an OData query that returns all active bugs with their area path and assigned-to fields in <Contoso> project |
| 日付でフィルター処理 | Create an OData query that returns work items created in the last 30 days in <Contoso> project |
| ナビゲーション プロパティを展開する | Write an OData query that expands the iteration path and area path for user stories in <Contoso> project |
| クエリをデバッグする | My OData query returns no results — help me troubleshoot the filter clause and URL format for <Contoso> project |
| 入れ子になった展開 | Write an OData query with nested expand to return work items with their parent details in <Contoso> project |
| 結果の並べ替えと制限 | Create an OData query that returns the 20 most recently changed bugs ordered by changed date in <Contoso> project |
| 作業項目の種類別のカウント | Write an OData query that counts work items grouped by work item type for <Contoso> project |
| 文字列関数を使用したフィルター処理 | Create an OData query that returns work items whose title contains "login" in <Contoso> project |
| 選択、フィルター、展開を組み合わせる | Write an OData query that returns the title, state, assigned-to name, and iteration path for all user stories in the current sprint in <Contoso> project |