Chạy các báo cáo

Bạn có thể tạo Báo cáo tương tác, chạy báo cáo hiện có và đọc kết quả báo cáo bằng API Ad Manager.

Nếu bạn chưa quen với báo cáo Tương tác trong Ad Manager, hãy xem bài viết Tạo báo cáo Tương tác để biết thông tin tổng quan về cách sử dụng báo cáo Tương tác trong giao diện người dùng Ad Manager.

Đối với các báo cáo phức tạp, bạn có thể sử dụng giao diện người dùng Ad Manager để kiểm tra khả năng tương thích của phương diện và chỉ số. Bạn có thể chạy tất cả báo cáo trên giao diện người dùng bằng API.

Hướng dẫn này trình bày cách bắt đầu chạy không đồng bộ của Report, thăm dò ý kiến về trạng thái Operation được trả về, lấy tên tài nguyên Result từ Operation đã hoàn tất và tìm nạp một tập hợp kết quả phân trang Rows.

Điều kiện tiên quyết

Trước khi tiếp tục, hãy đảm bảo bạn có quyền truy cập vào một mạng Google Ad Manager. Để có quyền truy cập, hãy xem bài viết Bắt đầu sử dụng Google Ad Manager.

Chạy báo cáo

Để chạy báo cáo, bạn cần có mã báo cáo. Bạn có thể lấy mã báo cáo trong giao diện người dùng Ad Manager thông qua URL báo cáo. Ví dụ: trong URL https://www.google.com/admanager/234093456#reports/interactive/detail/report_id=4555265029, mã báo cáo là 4555265029.

Bạn cũng có thể đọc các báo cáo mà người dùng có quyền truy cập bằng phương thức networks.reports.list và lấy mã nhận dạng từ tên tài nguyên:

networks/234093456/reports/4555265029

Sau khi có mã báo cáo, bạn có thể bắt đầu chạy báo cáo không đồng bộ bằng phương thức networks.reports.run. Phương thức này trả về tên tài nguyên của một Operation chạy trong thời gian dài. Xin lưu ý rằng trong mã ví dụ sau, [REPORT] là phần giữ chỗ cho mã báo cáo và [NETWORK] là phần giữ chỗ cho mã mạng của bạn. Để tìm mã mạng, hãy xem bài viết Tìm thông tin tài khoản 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

Yêu cầu

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

Phản hồi

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

Thăm dò trạng thái báo cáo

Nếu bạn đang sử dụng thư viện ứng dụng, mã ví dụ của phần trước sẽ thăm dò ý kiến về trạng thái của báo cáo chạy Operation theo các khoảng thời gian được đề xuất và cung cấp kết quả khi báo cáo hoàn tất. Để biết thêm thông tin về khoảng thời gian thăm dò ý kiến được đề xuất, hãy xem networks.reports.run.

Nếu bạn muốn kiểm soát nhiều hơn việc thăm dò ý kiến, hãy tạo một yêu cầu riêng để truy xuất trạng thái hiện tại của báo cáo đang chạy bằng phương thức 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

Yêu cầu

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

Phản hồi

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

Lấy tên tài nguyên kết quả

Sau khi chạy báo cáo Operation xong, báo cáo sẽ chứa tên tài nguyên của 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

Yêu cầu

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

Phản hồi

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

Đọc hàng kết quả

Tài nguyên Result có một phương thức duy nhất là networks.reports.results.fetchRows để đọc danh sách các hàng được phân trang. Mỗi hàng có một danh sách giá trị phương diện và một danh sách giá trị chỉ số được nhóm. Mỗi nhóm chứa giá trị chỉ số và mọi giá trị hoặc cờ so sánh. Để biết thêm thông tin về cờ, hãy xem bài viết Sử dụng cờ trong báo cáo tương tác.

Đối với các báo cáo không có dữ liệu so sánh hoặc phân chia theo phạm vi ngày, sẽ có một MetricValueGroup duy nhất với các giá trị chỉ số (ví dụ: lượt hiển thị hoặc lượt nhấp) cho toàn bộ phạm vi ngày của báo cáo.

Thứ tự của các giá trị phương diện và chỉ số giống với thứ tự trong ReportDefinition của Report.

Sau đây là ví dụ về JSON của ReportDefinition và phản hồi fetchRows tương ứng:

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

Nếu bạn đang sử dụng thư viện ứng dụng, phản hồi sẽ có một trình lặp yêu cầu các trang bổ sung một cách lười biếng. Bạn cũng có thể sử dụng các tham số pageTokenpageSize. Để biết thông tin chi tiết về các tham số này, hãy xem phần Tham số truy vấn. Nếu có một trang khác, phản hồi sẽ chứa trường nextPageToken có mã thông báo để sử dụng trong yêu cầu tiếp theo.

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

Yêu cầu ban đầu

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

Yêu cầu trang tiếp theo

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

Khắc phục sự cố với báo cáo

Tại sao báo cáo của tôi không được trả về trong API?
Đảm bảo rằng người dùng Ad Manager mà bạn đang xác thực có quyền truy cập vào Báo cáo tương tác. Bạn chỉ có thể đọc Báo cáo tương tác qua API Ad Manager.
Tại sao kết quả báo cáo trên mạng thử nghiệm của tôi lại trống?
Mạng thử nghiệm không phân phát quảng cáo, vì vậy, báo cáo phân phối sẽ không có dữ liệu.
Tại sao kết quả báo cáo trên mạng sản xuất của tôi lại trống?
Người dùng mà bạn đang xác thực có thể không có quyền truy cập vào dữ liệu mà bạn đang cố gắng báo cáo. Xác minh rằng quyền của vai trònhóm của họ được đặt chính xác.
Tại sao số lượt nhấp hoặc số lượt hiển thị trong vòng đời không khớp với báo cáo của tôi trong giao diện người dùng?
Số lượt hiển thị trên toàn bộ thời gian là số lượt hiển thị trong toàn bộ thời gian hoạt động của mục hàng, bất kể phạm vi ngày của báo cáo. Nếu một mục hàng vẫn đang phân phối, thì giá trị này có thể thay đổi giữa hai lần chạy của cùng một báo cáo.