Berichte erstellen

Mit der Ad Manager API können Sie einen interaktiven Bericht erstellen, einen vorhandenen Bericht ausführen und Berichtsergebnisse lesen.

Wenn Sie mit interaktiven Berichten in Ad Manager nicht vertraut sind, finden Sie unter Interaktiven Bericht erstellen eine Übersicht dazu, wie Sie sie auf der Ad Manager-Benutzeroberfläche verwenden.

Bei komplexen Berichten können Sie die Kompatibilität von Dimensionen und Messwerten in der Ad Manager-Benutzeroberfläche prüfen. Alle Berichte auf der Benutzeroberfläche können mit der API ausgeführt werden.

In diesem Leitfaden wird beschrieben, wie Sie eine asynchrone Ausführung einer Report initiieren, den zurückgegebenen Status Operation abfragen, den Ressourcennamen Result aus der abgeschlossenen Operation abrufen und eine paginaierte Ergebnismenge Rows abrufen.

Vorbereitung

Bevor Sie fortfahren, prüfen Sie, ob Sie Zugriff auf ein Google Ad Manager-Netzwerk haben. Wie Sie Zugriff erhalten, erfahren Sie im Hilfeartikel Einführung in Google Ad Manager.

Bericht erstellen

Um einen Bericht auszuführen, benötigen Sie die Berichts-ID. Sie können eine Berichts-ID in der Ad Manager-Benutzeroberfläche über die Berichts-URL abrufen. In der URL https://www.google.com/admanager/234093456#reports/interactive/detail/report_id=4555265029 lautet die Berichts-ID beispielsweise 4555265029.

Sie können auch Berichte lesen, auf die Ihr Nutzer Zugriff hat, indem Sie die networks.reports.list-Methode verwenden und die ID aus dem Ressourcennamen abrufen:

networks/234093456/reports/4555265029

Nachdem Sie die Berichts-ID haben, können Sie mit der Methode networks.reports.run eine asynchrone Ausführung des Berichts initiieren. Diese Methode gibt den Ressourcennamen eines lang laufenden Operation zurück. Im folgenden Beispielcode ist [REPORT] ein Platzhalter für die Berichts-ID und [NETWORK] ein Platzhalter für Ihren Netzwerkcode. Wie du deinen Netzwerkcode findest, erfährst du unter Ad Manager-Kontoinformationen finden.

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

Anfrage

curl -X POST -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/reports/{$REPORT_ID}:run"

Antwort

{
  "name": "networks/234093456/operations/reports/runs/6485392645",
  "metadata": {
    "@type": "type.googleapis.com/google.ads.admanager.v1.RunReportMetadata",
    "report": "networks/234093456/reports/4555265029"
  }
}

Berichtsstatus abfragen

Wenn Sie eine Clientbibliothek verwenden, wird im Beispielcode des vorherigen Abschnitts in den empfohlenen Intervallen der Status der Berichtsausführung Operation abgefragt und das Ergebnis wird ausgegeben, sobald die Ausführung abgeschlossen ist. Weitere Informationen zu den empfohlenen Polling-Intervallen finden Sie unter networks.reports.run.

Wenn Sie die Abfrage besser steuern möchten, können Sie mit der Methode networks.operations.reports.runs.get eine einzelne Anfrage senden, um den aktuellen Status eines laufenden Berichts abzurufen:

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

Anfrage

curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/operations/reports/runs/${OPERATION_ID}"

Antwort

{
  "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,
}

Ressourcennamen des Ergebnisses abrufen

Nach Abschluss der Berichtsausführung Operation enthält er den Ressourcennamen der 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

Anfrage

curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/operations/reports/runs/${OPERATION_ID}"

Antwort

{
  "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"
  }
}

Ergebniszeilen lesen

Die Result-Ressource hat eine einzige Methode, networks.reports.results.fetchRows, zum Lesen einer paginierten Liste von Zeilen. Jede Zeile enthält eine Liste von Dimensionswerten und eine Liste von gruppierten Messwertwerten. Jede Gruppe enthält den Messwert und alle Vergleichswerte oder Flags. Weitere Informationen zu Flags finden Sie unter Flags in interaktiven Berichten verwenden.

In Berichten ohne Vergleiche oder Aufschlüsselungen nach Zeitraum gibt es nur eine einzige MetricValueGroup mit Messwerten (z. B. Impressionen oder Klicks) für den gesamten Zeitraum des Berichts.

Die Reihenfolge der Dimensions- und Messwertwerte entspricht der Reihenfolge in der ReportDefinition der Report.

Im folgenden JSON-Beispiel wird eine ReportDefinition-Anfrage und die entsprechende fetchRows-Antwort gezeigt:

{
  "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
}

Wenn Sie eine Clientbibliothek verwenden, enthält die Antwort einen Iterator, der zusätzliche Seiten nach Bedarf anfordert. Sie können auch die Parameter pageToken und pageSize verwenden. Weitere Informationen zu diesen Parametern finden Sie unter Abfrageparameter. Wenn eine weitere Seite vorhanden ist, enthält die Antwort das Feld nextPageToken mit dem Token, das in der nächsten Anfrage verwendet werden soll.

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

Erste Anfrage

curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/reports/${REPORT_ID}/results/${RESULT_ID}:fetchRows"

Anfrage für die nächste Seite

curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
"https://admanager.googleapis.com/v1/networks/${NETWORK_CODE}/reports/${REPORT_ID}/results/${RESULT_ID}:fetchRows?pageToken=${PAGE_TOKEN}"

Probleme mit einem Bericht beheben

Warum wird mein Bericht nicht in der API zurückgegeben?
Achten Sie darauf, dass der Ad Manager-Nutzer, als der Sie sich authentifizieren, Zugriff auf den interaktiven Bericht hat. Interaktive Berichte können nur über die Ad Manager API gelesen werden.
Warum sind die Berichtsergebnisse in meinem Testnetzwerk leer?
In Testnetzwerken werden keine Anzeigen ausgeliefert. Daher enthalten Übermittlungsberichte keine Daten.
Warum sind die Berichtsergebnisse in meinem Produktionsnetzwerk leer?
Der Nutzer, als der Sie sich authentifizieren, hat möglicherweise keinen Zugriff auf die Daten, zu denen Sie Berichte erstellen möchten. Prüfen Sie, ob die Rollenberechtigungen und Teams richtig festgelegt sind.
Warum stimmen die Klicks oder Impressionen seit Beginn der Kampagne nicht mit den Werten in meinem Bericht auf der Benutzeroberfläche überein?
Lifetime-Impressionen beziehen sich auf die gesamte Lebensdauer der Werbebuchung, unabhängig vom Zeitraum des Berichts. Wenn für eine Werbebuchung weiterhin Anzeigen ausgeliefert werden, kann sich der Wert zwischen zwei Ausführungen desselben Berichts ändern.