Grundlegendes zu Berichten

Einführung

In diesem Leitfaden erfahren Sie, wie Sie mit der API einen Bericht erstellen und herunterladen. Sie umfasst sowohl eine vorhandene gespeicherte Berichtsabfrage verwenden und eine Ad-hoc-Berichtsabfrage erstellen.

Vorbereitung

Primer

Wenn Sie mit der Berichterstellung in Ad Manager nicht vertraut sind, finden Sie unter Neuen Bericht erstellen eine Übersicht dazu, wie Sie einen Bericht in der Ad Manager-Benutzeroberfläche ausführen. Die Benutzeroberfläche bietet eine Vorschau der Ausgabe sowie Kurzinfos, die erklären, welche Spalten- und Dimensionskombinationen unterstützt werden. Bei einer komplexen Berichtsabfrage ist es unter Umständen einfacher, und rufen Sie die Abfrage dann mit der API ab.

Abrufen einer gespeicherten ReportQuery

ReportQuery enthält alle Details des Berichts. Sie können Berichtsabfragen in auf der Ad Manager-Benutzeroberfläche und rufen sie mit der Funktion ReportService.getSavedQueriesByStatement . Die gespeicherte Abfrage-ID ist in der URL enthalten, wenn Sie eine Abfrage in der Benutzeroberfläche aufrufen. In der URL https://www.google.com/admanager/1234#reports/report/detail/report_id=456789 ist die Abfrage-ID 456789.

Wenn eine Abfrage nicht mit Ihrer API-Version kompatibel ist, SavedQuery.reportQuery wird null sein und SavedQuery.isCompatibleWithApiVersion wird false sein.

Kompatible gespeicherte Abfragen können mit oder ohne Änderungen ausgeführt werden.

Java

    StatementBuilder statementBuilder =
        new StatementBuilder()
            .where("id = :id")
            .orderBy("id ASC")
            .limit(1)
            .withBindVariableValue("id", savedQueryId);

    SavedQueryPage page = reportService.getSavedQueriesByStatement(statementBuilder.toStatement());
    SavedQuery savedQuery = Iterables.getOnlyElement(Arrays.asList(page.getResults()));

    if (!savedQuery.getIsCompatibleWithApiVersion()) {
      throw new IllegalStateException("The saved query is not compatible with this API version.");
    }

    ReportQuery reportQuery = savedQuery.getReportQuery();
    

Python

  statement = (ad_manager.StatementBuilder(version='v202508')
               .Where('id = :id')
               .WithBindVariable('id', int(saved_query_id))
               .Limit(1))

  response = report_service.getSavedQueriesByStatement(
      statement.ToStatement())

  if 'results' in response and len(response['results']):
    saved_query = response['results'][0]

    if saved_query['isCompatibleWithApiVersion']:
      report_job = {}

      # Set report query and optionally modify it.
      report_job['reportQuery'] = saved_query['reportQuery']
    

PHP

      $statementBuilder = (new StatementBuilder())->where('id = :id')
          ->orderBy('id ASC')
          ->limit(1)
          ->withBindVariableValue('id', $savedQueryId);

      $savedQueryPage = $reportService->getSavedQueriesByStatement(
          $statementBuilder->toStatement()
      );
      $savedQuery = $savedQueryPage->getResults()[0];

      if ($savedQuery->getIsCompatibleWithApiVersion() === false) {
          throw new UnexpectedValueException(
              'The saved query is not compatible with this API version.'
          );
      }

      $reportQuery = $savedQuery->getReportQuery();
    

C#

StatementBuilder statementBuilder = new StatementBuilder()
    .Where("id = :id")
    .OrderBy("id ASC")
    .Limit(1)
    .AddValue("id", savedQueryId);

SavedQueryPage page =
    reportService.getSavedQueriesByStatement(statementBuilder.ToStatement());
SavedQuery savedQuery = page.results[0];

if (!savedQuery.isCompatibleWithApiVersion)
{
    throw new InvalidOperationException("Saved query is not compatible with this " +
        "API version");
}

// Optionally modify the query.
ReportQuery reportQuery = savedQuery.reportQuery;
    

Ruby

  statement = ad_manager.new_statement_builder do |sb|
    sb.where = 'id = :saved_query_id'
    sb.with_bind_variable('saved_query_id', saved_query_id)
  end

  saved_query_page = report_service.get_saved_queries_by_statement(
      statement.to_statement()
  )

  unless saved_query_page[:results].nil?
    saved_query = saved_query_page[:results].first

    if saved_query[:is_compatible_with_api_version]
      # Create report job.
      report_job = {:report_query => saved_query[:report_query]}
    else
      raise StandardError, 'Report query is not compatible with the API'
    end
    

Informationen zum Ausführen der Abfrage finden Sie unter ReportJob erstellen.

ReportQuery erstellen

Neben gespeicherten Abfragen können Sie auch eine Ad-hoc-ReportQuery erstellen. Dazu müssen Sie die Methode Dimensionen Dimension Attribute Spalten, Filter und Zeitraum. Dieses Beispiel bezieht sich auf einen einfachen Auslieferungsbericht für einen einzelnen Auftrag.

Java

    // Create report query.
    ReportQuery reportQuery = new ReportQuery();
    reportQuery.setDimensions(new Dimension[] {Dimension.DATE, Dimension.ORDER_ID});
    reportQuery.setColumns(
        new Column[] {
          Column.AD_SERVER_IMPRESSIONS,
          Column.AD_SERVER_CLICKS,
          Column.AD_SERVER_CTR,
          Column.AD_SERVER_CPM_AND_CPC_REVENUE
        });
    reportQuery.setDimensionAttributes(
        new DimensionAttribute[] {
          DimensionAttribute.ORDER_TRAFFICKER,
          DimensionAttribute.ORDER_START_DATE_TIME,
          DimensionAttribute.ORDER_END_DATE_TIME
        });

    // Create statement to filter for an order.
    StatementBuilder statementBuilder =
        new StatementBuilder()
            .where("ORDER_ID = :orderId")
            .withBindVariableValue("orderId", orderId);

    // Set the filter statement.
    reportQuery.setStatement(statementBuilder.toStatement());

    // Set the start and end dates or choose a dynamic date range type.
    reportQuery.setDateRangeType(DateRangeType.CUSTOM_DATE);
    reportQuery.setStartDate(
        DateTimes.toDateTime("2013-05-01T00:00:00", "America/New_York").getDate());
    reportQuery.setEndDate(
        DateTimes.toDateTime("2013-05-31T00:00:00", "America/New_York").getDate());
    

Python

  # Create statement object to filter for an order.
  statement = (ad_manager.StatementBuilder(version='v202508')
               .Where('ORDER_ID = :id')
               .WithBindVariable('id', int(order_id))
               .Limit(None)  # No limit or offset for reports
               .Offset(None))

  # Set the start and end dates of the report to run (past 8 days).
  end_date = datetime.now().date()
  start_date = end_date - timedelta(days=8)

  # Create report job.
  report_job = {
      'reportQuery': {
          'dimensions': ['ORDER_ID', 'ORDER_NAME'],
          'dimensionAttributes': ['ORDER_TRAFFICKER', 'ORDER_START_DATE_TIME',
                                  'ORDER_END_DATE_TIME'],
          'statement': statement.ToStatement(),
          'columns': ['AD_SERVER_IMPRESSIONS', 'AD_SERVER_CLICKS',
                      'AD_SERVER_CTR', 'AD_SERVER_CPM_AND_CPC_REVENUE',
                      'AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM'],
          'dateRangeType': 'CUSTOM_DATE',
          'startDate': start_date,
          'endDate': end_date
      }
  }
    

PHP

      // Create report query.
      $reportQuery = new ReportQuery();
      $reportQuery->setDimensions(
          [
              Dimension::ORDER_ID,
              Dimension::ORDER_NAME
          ]
      );
      $reportQuery->setDimensionAttributes(
          [
              DimensionAttribute::ORDER_TRAFFICKER,
              DimensionAttribute::ORDER_START_DATE_TIME,
              DimensionAttribute::ORDER_END_DATE_TIME
          ]
      );
      $reportQuery->setColumns(
          [
              Column::AD_SERVER_IMPRESSIONS,
              Column::AD_SERVER_CLICKS,
              Column::AD_SERVER_CTR,
              Column::AD_SERVER_CPM_AND_CPC_REVENUE,
              Column::AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM
          ]
      );

      // Create statement to filter for an order.
      $statementBuilder = (new StatementBuilder())
          ->where('ORDER_ID = :orderId')
          ->withBindVariableValue(
              'orderId',
              $orderId
          );

      // Set the filter statement.
      $reportQuery->setStatement($statementBuilder->toStatement());

      // Set the start and end dates or choose a dynamic date range type.
      $reportQuery->setDateRangeType(DateRangeType::CUSTOM_DATE);
      $reportQuery->setStartDate(
          AdManagerDateTimes::fromDateTime(
              new DateTime(
                  '-10 days',
                  new DateTimeZone('America/New_York')
              )
          )
              ->getDate()
      );
      $reportQuery->setEndDate(
          AdManagerDateTimes::fromDateTime(
              new DateTime(
                  'now',
                  new DateTimeZone('America/New_York')
              )
          )
              ->getDate()
      );
    

C#

// Create report job.
ReportJob reportJob = new ReportJob();
reportJob.reportQuery = new ReportQuery();
reportJob.reportQuery.dimensions = new Dimension[]
{
    Dimension.ORDER_ID,
    Dimension.ORDER_NAME
};
reportJob.reportQuery.dimensionAttributes = new DimensionAttribute[]
{
    DimensionAttribute.ORDER_TRAFFICKER,
    DimensionAttribute.ORDER_START_DATE_TIME,
    DimensionAttribute.ORDER_END_DATE_TIME
};
reportJob.reportQuery.columns = new Column[]
{
    Column.AD_SERVER_IMPRESSIONS,
    Column.AD_SERVER_CLICKS,
    Column.AD_SERVER_CTR,
    Column.AD_SERVER_CPM_AND_CPC_REVENUE,
    Column.AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM
};

// Set a custom date range for the last 8 days
reportJob.reportQuery.dateRangeType = DateRangeType.CUSTOM_DATE;
System.DateTime endDateTime = System.DateTime.Now;
reportJob.reportQuery.startDate = DateTimeUtilities
    .FromDateTime(endDateTime.AddDays(-8), "America/New_York").date;
reportJob.reportQuery.endDate = DateTimeUtilities
    .FromDateTime(endDateTime, "America/New_York").date;

// Create statement object to filter for an order.
StatementBuilder statementBuilder = new StatementBuilder().Where("ORDER_ID = :id")
    .AddValue("id", orderId);
reportJob.reportQuery.statement = statementBuilder.ToStatement();
    

Ruby

  # Specify a report to run for the last 7 days.
  report_end_date = ad_manager.today()
  report_start_date = report_end_date - 7

  # Create statement object to filter for an order.
  statement = ad_manager.new_report_statement_builder do |sb|
    sb.where = 'ORDER_ID = :order_id'
    sb.with_bind_variable('order_id', order_id)
  end

  # Create report query.
  report_query = {
    :date_range_type => 'CUSTOM_DATE',
    :start_date => report_start_date.to_h,
    :end_date => report_end_date.to_h,
    :dimensions => ['ORDER_ID', 'ORDER_NAME'],
    :dimension_attributes => ['ORDER_TRAFFICKER', 'ORDER_START_DATE_TIME',
        'ORDER_END_DATE_TIME'],
    :columns => ['AD_SERVER_IMPRESSIONS', 'AD_SERVER_CLICKS', 'AD_SERVER_CTR',
        'AD_SERVER_CPM_AND_CPC_REVENUE', 'AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM'],
    :statement => statement.to_statement()
  }
    

ReportJob erstellen

Sobald Sie über eine ReportQuery verfügen, ist es an der Zeit, den Bericht zu erstellen. Die ReportJob-Objekt enthält den Status eines Berichts und informiert Sie, wenn er heruntergeladen werden kann. Bis erstellen Sie den Bericht, verwenden Sie ReportService.runReportJob .

Java

    // Create report job.
    ReportJob reportJob = new ReportJob();
    reportJob.setReportQuery(reportQuery);

    // Run report job.
    reportJob = reportService.runReportJob(reportJob);
    

Python

  # Initialize a DataDownloader.
  report_downloader = client.GetDataDownloader(version='v202508')

  try:
    # Run the report and wait for it to finish.
    report_job_id = report_downloader.WaitForReport(report_job)
  except errors.AdManagerReportError as e:
    print('Failed to generate report. Error was: %s' % e)
    

PHP

      // Create report job and start it.
      $reportJob = new ReportJob();
      $reportJob->setReportQuery($reportQuery);
      $reportJob = $reportService->runReportJob($reportJob);
    

C#

// Run report job.
reportJob = reportService.runReportJob(reportJob);
    

Ruby

  # Create report job.
  report_job = {:report_query => report_query}

  # Run report job.
  report_job = report_service.run_report_job(report_job);
    

Bericht herunterladen

Nachdem Sie den Berichtauftrag gestartet haben, wird eine ID vom Server festgelegt. Verwenden ID mit dem ReportService.getReportJobStatus um den Status Ihres Berichts zu überprüfen. Sobald der Status ReportJobStatus.COMPLETED kann der Bericht heruntergeladen werden.

Einige unserer Clientbibliotheken verfügen über Hilfsdienstprogramme, die die API abfragen und bis der Bericht fertig ist. Wenn der Bericht fertig ist, können Sie Download-URL mit dem ReportService.getReportDownloadURL . Ein Bericht kann in verschiedenen Formaten heruntergeladen werden. Wenn Sie mit dem Bericht weiter verarbeiten kann, sollten Sie die Methode CSV_DUMP Format.

Java

    // Create report downloader.
    ReportDownloader reportDownloader = new ReportDownloader(reportService, reportJob.getId());

    // Wait for the report to be ready.
    if (reportDownloader.waitForReportReady()) {
      // Change to your file location.
      File file = File.createTempFile("delivery-report-", ".csv.gz");

      System.out.printf("Downloading report to %s ...", file.toString());

      // Download the report.
      ReportDownloadOptions options = new ReportDownloadOptions();
      options.setExportFormat(ExportFormat.CSV_DUMP);
      options.setUseGzipCompression(true);
      URL url = reportDownloader.getDownloadUrl(options);
      Resources.asByteSource(url).copyTo(Files.asByteSink(file));

      System.out.println("done.");
    } else {
      System.out.printf("Report job %d failed.%n", reportJob.getId());
    }
    

Python

  # Change to your preferred export format.
  export_format = 'CSV_DUMP'

  report_file = tempfile.NamedTemporaryFile(suffix='.csv.gz', delete=False)

  # Download report data.
  report_downloader.DownloadReportToFile(
      report_job_id, export_format, report_file)

  report_file.close()

  # Display results.
  print('Report job with id "%s" downloaded to:\n%s' % (
      report_job_id, report_file.name))
    

PHP

      // Create report downloader to poll report's status and download when
      // ready.
      $reportDownloader = new ReportDownloader(
          $reportService,
          $reportJob->getId()
      );
      if ($reportDownloader->waitForReportToFinish()) {
          // Write to system temp directory by default.
          $filePath = sprintf(
              '%s.csv.gz',
              tempnam(sys_get_temp_dir(), 'delivery-report-')
          );
          printf("Downloading report to %s ...%s", $filePath, PHP_EOL);
          // Download the report.
          $reportDownloader->downloadReport(
              ExportFormat::CSV_DUMP,
              $filePath
          );
          print "done.\n";
      } else {
          print "Report failed.\n";
      }
    

C#

ReportUtilities reportUtilities =
    new ReportUtilities(reportService, reportJob.id);

// Set download options.
ReportDownloadOptions options = new ReportDownloadOptions();
options.exportFormat = ExportFormat.CSV_DUMP;
options.useGzipCompression = true;
reportUtilities.reportDownloadOptions = options;

// Download the report.
using (ReportResponse reportResponse = reportUtilities.GetResponse())
{
    reportResponse.Save(filePath);
}

Console.WriteLine("Report saved to \"{0}\".", filePath);
    

Ruby

  MAX_RETRIES.times do |retry_count|
    # Get the report job status.
    report_job_status = report_service.get_report_job_status(report_job[:id])

    break unless report_job_status == 'IN_PROGRESS'
    puts 'Report with ID %d is still running.' % report_job[:id]
    sleep(RETRY_INTERVAL)
  end

  puts 'Report job with ID %d finished with status "%s".' % [report_job[:id],
      report_service.get_report_job_status(report_job[:id])]

  # Get the report URL.
  download_url = report_service.get_report_download_url(
      report_job_id, export_format
  )

  puts 'Downloading "%s" to "%s"...' % [download_url, file_name]
  open(file_name, 'wb') do |local_file|
    local_file << URI.open(download_url).read()
  end
    

Lesen der Berichtsdaten

Viele unserer Clientbibliotheken enthalten Dienstprogramme zum Lesen von Berichtsdaten. Dies ist sind nützlich, um die Berichtsdaten weiter zu verarbeiten oder Berichte zu kombinieren. aus verschiedenen Zeiträumen. Im Beispielcode wird davon ausgegangen, dass die Datei nicht komprimiert.

Java

  List<String[]> rows = CsvFiles.getCsvDataArray(filePath, true);
  for (String[] row : rows) {
    // Additional row processing
    processReportRow(row);
  }
    

Python

  with open(report_file.name, 'rb') as report:
    report_reader = csv.reader(report)
    for row in report_reader:
      # Additional row processing
      process_row(row)
    

PHP

  $report = fopen($filePath, 'r');
  while (!feof($report)) {
    // Additional row processing
    processRow(fgetcsv($report));
  }
  fclose($report);
    

C#

  CsvFile file = new CsvFile();
  file.Read(fileName, true);
  for (String[] row : file.Records) {
    // Additional row processing
    ProcessReportRow(row);
  }
    

Ruby

    CSV.foreach(file_name, converters: :numeric, headers: true) do |row|
      # Additional row processing
      process_row(row)
    end
    

Weitere Beispiele für die Berichterstellung finden Sie in unserem Kundenkonto Bibliotheken auf GitHub.

FAQ

Warum sind alle Berichtsergebnisse in meinem Testnetzwerk leer?
In Testnetzwerken werden keine Anzeigen ausgeliefert, daher enthalten Auslieferungsberichte keine Daten.
Warum sind alle Berichtsergebnisse in meinem Produktionsnetzwerk leer?
Der zu authentifizierende Nutzer hat möglicherweise keinen Zugriff auf Ihre Daten über die Sie einen Bericht erstellen möchten. Prüfen Sie, ob das Rollenberechtigungen und Teams richtig festgelegt sind.
Warum erhalte ich für meinen Bericht die Fehlermeldung ReportError.COLUMNS_NOT_SUPPORTED_FOR_REQUESTED_DIMENSIONS?
In Ad Manager werden nicht alle Kombinationen aus Spalten und Dimensionen unterstützt. Bei komplexen Berichten ist es unter Umständen einfacher, einen gültigen Bericht in der Benutzeroberfläche zu erstellen und dann mit der Funktion ReportService.getSavedQueriesByStatement
Warum wird mein gespeicherter Bericht in der API nicht zurückgegeben?
Vergewissern Sie sich, dass der Inhaber des Berichts den Bericht für den Nutzer freigegeben hat, den Sie sind Authentifizierung als
Warum ist mein gespeicherter Bericht nicht mit der API kompatibel?
Bestimmte Berichtsfunktionen sind in der API nicht verfügbar. Dazu gehören Spalten, Dimensionsattribute, Dimensionen und Zeitraumtypen. Für Zeitraumtypen nicht kompatibel sind, können Sie den Bericht mit einem unterstützten Typ speichern, machen sie abrufbar und dann „ReportQuery“ so, dass sie den gewünschten festen Zeitraum erfüllt.
Warum stimmen die Gesamtzahl der Klicks/Impressionen nicht mit meinem Bericht in der Benutzeroberfläche überein?
Lifetime-Impressionen gelten für die gesamte Laufzeit der Werbebuchung, Zeitraum des Berichts. Wird eine Werbebuchung noch ausgeliefert, zwischen der Erstellung zweier Berichte ändern.
Die Ausführung meiner Berichte dauert zu lange und es kommt gelegentlich zu einer Zeitüberschreitung. Was kann ich tun?
Wenn Sie den Zeitraum oder die Anzahl der Dimensionen verringern, können Sie die Leistung verbessern die Leistung. Erstellen Sie stattdessen mehrere Berichte für kürzere Zeiträume. Ich können die Berichtsdaten dann zusammengeführt werden, um den gewünschten Zeitraum abzudecken.
Was ist der Unterschied zwischen den Spalten „INVENTORY_LEVEL“ und „LINE_ITEM_LEVEL“? Was soll ich verwenden?

Spalten mit LINE_ITEM_LEVEL können nur auf Werbebuchungsebene verwendet werden in Ihrem Netzwerk aktiviert ist. Diese Spalten enthalten Daten aus den die dynamische Zuordnung auf Werbebuchungsebene zu AdSense oder Ad Exchange. Die Funktion Die Spalten „INVENTORY_LEVEL“ enthalten Daten aus der dynamischen Zuordnung auf Inventarebene. Weitere Informationen zur dynamischen Zuordnung finden Sie unter Ad Exchange-Werbebuchungen.

Wenn Sie immer noch unsicher sind, welche API-Spalten Sie verwenden sollen, erstellen Sie eine gespeicherte Abfrage im auf der Ad Manager-Benutzeroberfläche und rufen sie mit der Funktion ReportService.getSavedQueriesByStatement .