הפקת דוחות

אפשר ליצור דוח אינטראקטיבי, להריץ דוח קיים ולקרוא את תוצאות הדוח באמצעות Ad Manager API.

אם אתם לא יודעים איך משתמשים בדוחות האינטראקטיביים ב-Ad Manager, תוכלו לקרוא את המאמר יצירת דוח אינטראקטיבי כדי לקבל סקירה כללית על השימוש בדוחות האינטראקטיביים בממשק המשתמש של Ad Manager.

בדוחות מורכבים, אפשר להשתמש בממשק המשתמש של Ad Manager כדי לבדוק את התאימות של המאפיינים והמדדים. אפשר להריץ את כל הדוחות בממשק המשתמש באמצעות ה-API.

במדריך הזה נסביר איך מפעילים הפעלה אסינכררונית של Report, בודקים את הסטטוס Operation שמוחזר, מקבלים את שם המשאב Result מהפעולה Operation שהושלמו ומאחזרים קבוצת תוצאות עם דפים Rows.

דרישות מוקדמות

לפני שממשיכים, צריך לוודא שיש לכם גישה לרשת של Google Ad Manager. במאמר תחילת העבודה עם Google Ad Manager מוסבר איך לקבל גישה.

הרצת דוח

כדי להריץ דוח, צריך את מזהה הדוח. אפשר לקבל מזהה דוח בממשק המשתמש של Ad Manager דרך כתובת ה-URL של הדוח. לדוגמה, בכתובת ה-URL‏ https://www.google.com/admanager/234093456#reports/interactive/detail/report_id=4555265029 מזהה הדוח הוא 4555265029.

אפשר גם לקרוא דוחות שיש למשתמש גישה אליהם באמצעות השיטה networks.reports.list ולקבל את המזהה משם המשאב:

networks/234093456/reports/4555265029

אחרי שמקבלים את מזהה הדוח, אפשר להריץ את הדוח באופן אסינכררוני באמצעות השיטה networks.reports.run. השיטה הזו מחזירה את שם המשאב של Operation ממושכת. שימו לב שבקוד לדוגמה הבא, [REPORT] הוא placeholder למזהה הדוח ו-[NETWORK] הוא placeholder לקוד הרשת. במאמר איך מוצאים את פרטי החשבון ב-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

בקשה

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

תשובה

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

סקרים לגבי סטטוס הדוח

אם אתם משתמשים בספריית לקוח, קוד הדוגמה בקטע הקודם בודק את סטטוס ההרצה של הדוח Operation במרווחי הזמן המומלצים ומספק את התוצאה בסיום. למידע נוסף על מרווחי הזמן המומלצים לבדיקות, ראו networks.reports.run.

אם רוצים לשלוט יותר בסקרים, אפשר לשלוח בקשה ספציפית לאחזור הסטטוס הנוכחי של דוח פעיל באמצעות השיטה 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

בקשה

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

תשובה

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

אחזור שם המשאב של התוצאה

בסיום ההרצה של הדוח Operation, הוא מכיל את שם המשאב של 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

בקשה

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

תשובה

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

קריאת שורות התוצאה

למשאב Result יש שיטה אחת, networks.reports.results.fetchRows, לקריאת רשימה של שורות שמחולקות לדפים. בכל שורה מופיעה רשימה של ערכי מאפיינים ורשימה של ערכי מדדים מקובצים. כל קבוצה מכילה את ערך המדד ואת ערכי ההשוואה או הדגלים. למידע נוסף על דגלים, ראו שימוש בדגלים בדוח האינטראקטיבי.

בדוחות ללא השוואות או חלוקות של טווחי תאריכים, יש רק MetricValueGroup אחד עם ערכי מדדים (לדוגמה, חשיפות או קליקים) לכל טווח התאריכים של הדוח.

הסדר של ערכי המאפיינים והמדדים זהה לסדר שמופיע ב-ReportDefinition של Report.

בהמשך מופיעה דוגמה ל-JSON של ReportDefinition ותגובה תואמת של fetchRows:

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

אם אתם משתמשים בספריית לקוח, התגובה כוללת מעבד (iterator) שמבקש דפים נוספים באופן עצלני. אפשר גם להשתמש בפרמטר pageToken ובפרמטר pageSize. פרטים על הפרמטרים האלה מופיעים בקטע פרמטרים של שאילתות. אם יש דף נוסף, התשובה תכיל את השדה nextPageToken עם האסימון שצריך להשתמש בו בבקשה הבאה.

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

הבקשה הראשונית

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

בקשה לדף הבא

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

פתרון בעיות בדוחות

למה הדוח שלי לא מוחזר ב-API?
מוודאים שלמשתמש ב-Ad Manager שאיתו מבצעים את האימות יש גישה לדוח האינטראקטיבי. אפשר לקרוא דוחות אינטראקטיביים רק מ-Ad Manager API.
למה תוצאות הדוחות ברשת הבדיקה שלי ריקות?
ברשתות הבדיקה לא מוצגות מודעות, ולכן בדוחות ההצגה לא מוצגים נתונים.
למה תוצאות הדוח ברשת הייצור שלי ריקות?
יכול להיות שלמשתמש שאתם מבצעים אימות בשם שלו אין גישה לנתונים שאתם מנסים לדווח עליהם. מוודאים שהרשאות התפקיד והצוותים מוגדרים בצורה נכונה.
למה מספר הקליקים או החשיפות במצטבר לא תואם לדוח שלי בממשק המשתמש?
החשיפות בכל משך החיים מתייחסות לכל משך החיים של הפריט, ללא קשר לטווח התאריכים של הדוח. אם פריט שורה עדיין מניב ביצועים, הערך עשוי להשתנות בין שתי הפעלות של אותו דוח.