Vous pouvez créer un rapport interactif, exécuter un rapport existant et lire les résultats du rapport à l'aide de l'API Ad Manager.
Si vous ne connaissez pas bien les rapports interactifs dans Ad Manager, consultez Créer un rapport interactif pour découvrir comment les utiliser dans l'interface utilisateur d'Ad Manager.
Pour les rapports complexes, vous pouvez utiliser l'interface utilisateur d'Ad Manager pour vérifier la compatibilité des dimensions et des métriques. Tous les rapports de l'UI peuvent être exécutés avec l'API.
Ce guide explique comment lancer une exécution asynchrone d'un Report
, interroger l'état Operation
renvoyé, obtenir le nom de la ressource Result
à partir de l'Operation
terminée et récupérer un ensemble de résultats paginé Rows
.
Conditions préalables
Avant de continuer, assurez-vous d'avoir accès à un réseau Google Ad Manager. Pour y accéder, consultez Premiers pas avec Google Ad Manager.
Générer un rapport
Pour générer un rapport, vous avez besoin de son ID. Vous pouvez obtenir un ID de rapport dans l'interface utilisateur d'Ad Manager via l'URL du rapport. Par exemple, dans l'URL https://www.google.com/admanager/234093456#reports/interactive/detail/report_id=4555265029
, l'ID du rapport est 4555265029
.
Vous pouvez également lire les rapports auxquels votre utilisateur a accès à l'aide de la méthode networks.reports.list
et obtenir l'ID à partir du nom de la ressource:
networks/234093456/reports/4555265029
Une fois que vous avez obtenu l'ID du rapport, vous pouvez lancer une exécution asynchrone du rapport à l'aide de la méthode networks.reports.run
. Cette méthode renvoie le nom de ressource d'une Operation
de longue durée.
Notez que dans l'exemple de code suivant, [REPORT]
est un espace réservé pour l'ID du rapport et [NETWORK]
est un espace réservé pour votre code réseau. Pour trouver votre code de réseau, consultez Rechercher des informations de compte Ad Manager.
Java
import com.google.ads.admanager.v1.ReportName;
import com.google.ads.admanager.v1.ReportServiceClient;
import com.google.ads.admanager.v1.RunReportResponse;
public class SyncRunReportReportname {
public static void main(String[] args) throws Exception {
syncRunReportReportname();
}
public static void syncRunReportReportname() throws Exception {
try (ReportServiceClient reportServiceClient = ReportServiceClient.create()) {
ReportName name = ReportName.of("[NETWORK_CODE]", "[REPORT]");
RunReportResponse response = reportServiceClient.runReportAsync(name).get();
}
}
}
Python
from google.ads import admanager_v1 def sample_run_report(): # Create a client client = admanager_v1.ReportServiceClient() # Initialize request argument(s) request = admanager_v1.RunReportRequest( name="networks/[NETWORK_CODE]/reports/[REPORT]", ) # Make the request operation = client.run_report(request=request) print("Waiting for operation to complete...") response = operation.result() # Handle the response print(response)
.NET
using Google.Ads.AdManager.V1;
using Google.LongRunning;
public sealed partial class GeneratedReportServiceClientSnippets
{
public void RunReportResourceNames()
{
// Create client
ReportServiceClient reportServiceClient = ReportServiceClient.Create();
// Initialize request argument(s)
ReportName name = ReportName.FromNetworkCodeReport("[NETWORK_CODE]", "[REPORT]");
// Make the request
Operation<RunReportResponse, RunReportMetadata> response = reportServiceClient.RunReport(name);
// Poll until the returned long-running operation is complete
Operation<RunReportResponse, RunReportMetadata> completedResponse = response.PollUntilCompleted();
// Retrieve the operation result
RunReportResponse result = completedResponse.Result;
// Or get the name of the operation
string operationName = response.Name;
// This name can be stored, then the long-running operation retrieved later by name
Operation<RunReportResponse, RunReportMetadata> retrievedResponse = reportServiceClient.PollOnceRunReport(operationName);
// Check if the retrieved long-running operation has completed
if (retrievedResponse.IsCompleted)
{
// If it has completed, then access the result
RunReportResponse retrievedResult = retrievedResponse.Result;
}
}
}
cURL
Requête
curl -X POST -H "Authorization: Bearer ${ACCESS_TOKEN}" \ "https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/reports/{$REPORT_ID}:run"
Réponse
{ "name": "networks/234093456/operations/reports/runs/6485392645", "metadata": { "@type": "type.googleapis.com/google.ads.admanager.v1.RunReportMetadata", "report": "networks/234093456/reports/4555265029" } }
Interroger l'état du rapport
Si vous utilisez une bibliothèque cliente, l'exemple de code de la section précédente interroge l'état de l'exécution du rapport Operation
aux intervalles recommandés et fournit le résultat une fois l'exécution terminée. Pour en savoir plus sur les intervalles d'interrogation recommandés, consultez networks.reports.run
.
Si vous souhaitez mieux contrôler l'interrogation, effectuez une requête individuelle pour récupérer l'état actuel d'un rapport en cours d'exécution à l'aide de la méthode networks.operations.reports.runs.get
:
Java
import com.google.ads.admanager.v1.ReportServiceSettings;
import com.google.api.gax.longrunning.OperationalTimedPollAlgorithm;
import com.google.api.gax.retrying.RetrySettings;
import com.google.api.gax.retrying.TimedRetryAlgorithm;
import java.time.Duration;
public class SyncRunReport {
public static void main(String[] args) throws Exception {
syncRunReport();
}
public static void syncRunReport() throws Exception {
ReportServiceSettings.Builder reportServiceSettingsBuilder = ReportServiceSettings.newBuilder();
TimedRetryAlgorithm timedRetryAlgorithm =
OperationalTimedPollAlgorithm.create(
RetrySettings.newBuilder()
.setInitialRetryDelayDuration(Duration.ofMillis(500))
.setRetryDelayMultiplier(1.5)
.setMaxRetryDelayDuration(Duration.ofMillis(5000))
.setTotalTimeoutDuration(Duration.ofHours(24))
.build());
reportServiceSettingsBuilder
.createClusterOperationSettings()
.setPollingAlgorithm(timedRetryAlgorithm)
.build();
}
}
Python
from google.ads import admanager_v1 from google.longrunning.operations_pb2 import GetOperationRequest def sample_poll_report(): # Run the report client = admanager_v1.ReportServiceClient() response = client.run_report(name="networks/[NETWORK_CODE]/reports/[REPORT_ID]") # Check if the long-running operation has completed operation = client.get_operation( GetOperationRequest(name=response.operation.name)) if(operation.done): # If it has completed, then access the result run_report_response = admanager_v1.RunReportResponse.deserialize(payload=operation.response.value)
.NET
Operation<RunReportResponse, RunReportMetadata> retrievedResponse = reportServiceClient.PollOnceRunReport(operationName); // Check if the retrieved long-running operation has completed if (retrievedResponse.IsCompleted) { // If it has completed, then access the result RunReportResponse retrievedResult = retrievedResponse.Result; }
cURL
Requête
curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/operations/reports/runs/${OPERATION_ID}"
Réponse
{ "name": "networks/234093456/operations/reports/runs/6485392645", "metadata": { "@type": "type.googleapis.com/google.ads.admanager.v1.RunReportMetadata", "percentComplete": 50, "report": "networks/234093456/reports/4555265029" }, "done": false, }
Obtenir le nom de la ressource de résultat
Une fois l'exécution du rapport Operation
terminée, il contient le nom de la ressource de l'Result
.
Java
RunReportResponse response = reportServiceClient.runReportAsync(name).get();
// Result name in the format networks/[NETWORK_CODE]/reports/[REPORT_ID]/results/[RESULT_ID]
String resultName = response.getReportResult();
Python
operation = client.run_report(request=request)
response = operation.result()
# Result name in the format networks/[NETWORK_CODE]/reports/[REPORT_ID]/results/[RESULT_ID]
result_name = response.report_result
.NET
Operation<RunReportResponse, RunReportMetadata> response = reportServiceClient.RunReport(request);
// Poll until the returned long-running operation is complete
Operation<RunReportResponse, RunReportMetadata> completedResponse = response.PollUntilCompleted();
RunReportResponse result = completedResponse.Result;
// Result name in the format networks/[NETWORK_CODE]/reports/[REPORT_ID]/results/[RESULT_ID]
string resultName = result.ReportResult;
cURL
Requête
curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/operations/reports/runs/${OPERATION_ID}"
Réponse
{ "name": "networks/234093456/operations/reports/runs/6485392645", "metadata": { "@type": "type.googleapis.com/google.ads.admanager.v1.RunReportMetadata", "percentComplete": 100, "report": "networks/234093456/reports/4555265029" }, "done": true, "response": { "@type": "type.googleapis.com/google.ads.admanager.v1.RunReportResponse", "reportResult": "networks/234093456/reports/4555265029/results/7031632628" } }
Lire les lignes de résultats
La ressource Result
comporte une seule méthode, networks.reports.results.fetchRows
, pour lire une liste paginée de lignes. Chaque ligne contient une liste de valeurs de dimension et une liste de valeurs de métrique groupées. Chaque groupe contient la valeur de la métrique, ainsi que les valeurs ou indicateurs de comparaison. Pour en savoir plus sur les indicateurs, consultez la section Utiliser des indicateurs dans votre rapport interactif.
Pour les rapports sans comparaisons ni répartitions de la plage de dates, il n'y a qu'un seul MetricValueGroup
avec des valeurs de métrique (par exemple, impressions ou clics) pour l'ensemble de la plage de dates du rapport.
L'ordre des valeurs de dimension et de métrique est le même que celui dans la ReportDefinition
de Report
.
Voici un exemple JSON d'une requête ReportDefinition
et d'une réponse fetchRows
correspondante:
{
"name": "networks/234093456/reports/4555265029",
"visibility": "SAVED",
"reportId": "4555265029",
"reportDefinition": {
"dimensions": [
"LINE_ITEM_NAME",
"LINE_ITEM_ID"
],
"metrics": [
"AD_SERVER_IMPRESSIONS"
],
"currencyCode": "USD",
"dateRange": {
"relative": "YESTERDAY"
},
"reportType": "HISTORICAL"
},
"displayName": "Example Report",
"updateTime": "2024-09-01T13:00:00Z",
"createTime": "2024-08-01T02:00:00Z",
"locale": "en-US",
"scheduleOptions": {}
}
{
"rows": [
{
"dimensionValues": [
{
"stringValue": "Line Item #1"
},
{
"intValue": "6378470710"
}
],
"metricValueGroups": [
{
"primaryValues": [
{
"intValue": "100"
}
]
}
]
},
{
"dimensionValues": [
{
"stringValue": "Line Item #2"
},
{
"intValue": "5457147368"
}
],
"metricValueGroups": [
{
"primaryValues": [
{
"intValue": "95"
}
]
}
]
}
],
"runTime": "2024-10-02T10:00:00Z",
"dateRanges": [
{
"startDate": {
"year": 2024,
"month": 10,
"day": 1
},
"endDate": {
"year": 2024,
"month": 10,
"day": 1
}
}
],
"totalRowCount": 2
}
Si vous utilisez une bibliothèque cliente, la réponse contient un itérateur qui demande de manière paresseuse des pages supplémentaires. Vous pouvez également utiliser les paramètres pageToken
et pageSize
. Pour en savoir plus sur ces paramètres, consultez la section Paramètres de requête.
Si une autre page existe, la réponse contient un champ nextPageToken
avec le jeton à utiliser dans la requête suivante.
Java
import com.google.ads.admanager.v1.Report;
import com.google.ads.admanager.v1.ReportServiceClient;
public class SyncFetchReportResultRowsString {
public static void main(String[] args) throws Exception {
syncFetchReportResultRowsString();
}
public static void syncFetchReportResultRowsString() throws Exception {
try (ReportServiceClient reportServiceClient = ReportServiceClient.create()) {
String name = "networks/[NETWORK_CODE]/reports/[REPORT_ID]/results/[RESULT_ID]";
for (Report.DataTable.Row element :
reportServiceClient.fetchReportResultRows(name).iterateAll()) {
}
}
}
}
Python
from google.ads import admanager_v1
def sample_fetch_report_result_rows():
# Create a client
client = admanager_v1.ReportServiceClient()
# Initialize request argument(s)
request = admanager_v1.FetchReportResultRowsRequest(
)
# Make the request
page_result = client.fetch_report_result_rows(request=request)
# Handle the response
for response in page_result:
print(response)
.NET
using Google.Ads.AdManager.V1;
using Google.Api.Gax;
using System;
public sealed partial class GeneratedReportServiceClientSnippets
{
public void FetchReportResultRows()
{
// Create client
ReportServiceClient reportServiceClient = ReportServiceClient.Create();
// Initialize request argument(s)
string name = "";
// Make the request
PagedEnumerable<FetchReportResultRowsResponse, Report.Types.DataTable.Types.Row> response = reportServiceClient.FetchReportResultRows(name);
// Iterate over all response items, lazily performing RPCs as required
foreach (Report.Types.DataTable.Types.Row item in response)
{
// Do something with each item
Console.WriteLine(item);
}
// Or iterate over pages (of server-defined size), performing one RPC per page
foreach (FetchReportResultRowsResponse page in response.AsRawResponses())
{
// Do something with each page of items
Console.WriteLine("A page of results:");
foreach (Report.Types.DataTable.Types.Row item in page)
{
// Do something with each item
Console.WriteLine(item);
}
}
// Or retrieve a single page of known size (unless it's the final page), performing as many RPCs as required
int pageSize = 10;
Page<Report.Types.DataTable.Types.Row> singlePage = response.ReadPage(pageSize);
// Do something with the page of items
Console.WriteLine($"A page of {pageSize} results (unless it's the final page):");
foreach (Report.Types.DataTable.Types.Row item in singlePage)
{
// Do something with each item
Console.WriteLine(item);
}
// Store the pageToken, for when the next page is required.
string nextPageToken = singlePage.NextPageToken;
}
}
cURL
Demande initiale
curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/reports/${REPORT_ID}/results/${RESULT_ID}:fetchRows"
Demande de page suivante
curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/reports/${REPORT_ID}/results/${RESULT_ID}:fetchRows?pageToken=${PAGE_TOKEN}"
Résoudre les problèmes liés à un rapport
- Pourquoi mon rapport n'est-il pas renvoyé dans l'API ?
- Assurez-vous que l'utilisateur Ad Manager que vous authentifiez a accès au rapport "Interactivité". Vous ne pouvez lire les rapports interactifs que depuis l'API Ad Manager.
- Pourquoi les résultats des rapports sur mon réseau de test sont-ils vides ?
- Les réseaux de test ne diffusent pas d'annonces. Par conséquent, les rapports sur la diffusion ne contiennent pas de données.
- Pourquoi les résultats du rapport sur mon réseau de production sont-ils vides ?
- L'utilisateur que vous authentifiez n'a peut-être pas accès aux données que vous essayez de créer en rapport. Vérifiez que leurs autorisations de rôle et leurs équipes sont correctement définies.
- Pourquoi les clics ou les impressions sur toute la durée ne correspondent-ils pas à mon rapport dans l'UI ?
- Les impressions sur toute la durée de vie correspondent à l'ensemble de la durée de vie de l'élément de campagne, quelle que soit la période du rapport. Si un élément de campagne est toujours diffusé, la valeur peut changer entre deux exécutions du même rapport.