创建和修改报告

Report 对象定义了一个可重用的模板,用于描述您要生成的报告。Report 对象用于配置报告的维度、指标和日期范围等条件。

本指南介绍了如何使用 Curation Partners API 创建报告来跟踪效果、修改现有报告以更好地满足您的需求,或删除过时报告的模板。

准备工作

在继续操作之前,您必须设置身份验证。

创建报告

您可以使用 curators.reports.create 方法创建报告。报告用于配置报告查询的维度、指标、日期范围、时区、过滤条件和默认排序。

以下示例向 curators.reports.create 方法发送 POST 请求,其中包含一个 Report 对象的 JSON 正文:

REST

请求

curl --request POST \
  'https://curationpartners.googleapis.com/v1/curators/ACCOUNT_ID/reports' \
  --header 'Authorization: Bearer ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "Monthly Data Segment Performance",
    "reportDefinition": {
      "dimensions": [
        "DATE",
        "CURATION_DATA_SEGMENT_ID"
      ],
      "metrics": [
        "IMPRESSIONS",
        "CLICKS",
        "SPEND",
        "CURATION_PARTNER_FEE"
      ],
      "dateRange": {
        "relative": "LAST_30_DAYS"
      },
      "timeZoneSource": "UTC"
    }
  }' \
  --compressed

替换以下内容:

  • ACCOUNT_ID:您的账号 ID
  • ACCESS_TOKEN:您的访问令牌

响应

{
  "name": "curators/ACCOUNT_ID/reports/123456789",
  "reportId": "123456789",
  "displayName": "Monthly Data Segment Performance",
  "reportDefinition": {
    "dimensions": [
      "DATE",
      "CURATION_DATA_SEGMENT_ID"
    ],
    "metrics": [
      "IMPRESSIONS",
      "CLICKS",
      "SPEND",
      "CURATION_PARTNER_FEE"
    ],
    "dateRange": {
      "relative": "LAST_30_DAYS"
    },
    "timeZoneSource": "UTC"
  },
  "createTime": "2026-08-01T10:00:00Z",
  "updateTime": "2026-08-01T10:00:00Z",
  "locale": "en"
}

创建报告时,您必须使用以下字段填充 reportDefinition 对象:

  • dimensions:可用于对报告中的指标进行分组的维度列表,例如 DATE、CURATION_DATA_SEGMENT_ID、DEAL_ID 或 ENVIRONMENT。
  • metrics:要汇总的指标列表,例如 IMPRESSIONS、CLICKS、SPEND 或 CURATION_PARTNER_FEE。
  • dateRange:报告的日期范围。日期范围可以指定为相对于报告运行时间的范围(例如 LAST_30_DAYS 或 YESTERDAY),也可以指定为包含 startDate 和 endDate 的固定范围。

您可以选择性地配置以下字段:

  • timeZoneSource:应用于报告的时区的来源。默认为 AD_EXCHANGE 枚举值,即使用太平洋时区。
  • timeZone:IANA 时区字符串,例如 "America/New_York"。当您将 timeZoneSource 字段设置为 PROVIDED 值时,必须填充此字段。
  • filters:将报告数据限制为指定维度或指标的特定值。
  • sorts:报告结果行的默认排序顺序。

Java

/*
 * Copyright (c) 2026 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.api.services.samples.curationpartners.v1.curators.reports;

import com.google.api.services.curationpartners.v1.CurationPartners;
import com.google.api.services.curationpartners.v1.model.DateRange;
import com.google.api.services.curationpartners.v1.model.Report;
import com.google.api.services.curationpartners.v1.model.ReportDefinition;
import com.google.api.services.samples.curationpartners.v1.Utils;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.List;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

public class CreateReport {

  /**
   * Executes the create operation for a report.
   *
   * @param curationPartnersClient the initialized Curation Partners API client.
   * @param accountId the account ID of the curator that will create the report.
   * @param displayName the display name of the report to be created.
   * @param dimensions the list of dimensions to include in the report definition.
   * @param metrics the list of metrics to include in the report definition.
   * @param relativeDateRange the relative date range for the report.
   * @throws IOException if the API returns an error.
   */
  public static void execute(
      CurationPartners curationPartnersClient,
      Long accountId,
      String displayName,
      List<String> dimensions,
      List<String> metrics,
      String relativeDateRange)
      throws IOException {
    String parent = String.format("curators/%s", accountId);

    System.out.printf("Creating Report \"%s\" for curator with name \"%s\".%n",
        displayName, parent);

    ReportDefinition reportDefinition =
        new ReportDefinition()
            .setDimensions(dimensions)
            .setMetrics(metrics)
            .setDateRange(new DateRange().setRelative(relativeDateRange));

    Report newReport =
        new Report()
            .setDisplayName(displayName)
            .setReportDefinition(reportDefinition);

    // Create a new report.
    Report createdReport =
        curationPartnersClient
            .curators()
            .reports()
            .create(parent, newReport)
            .execute();

    System.out.println("Successfully created report:");
    Utils.jsonPrettyPrint(createdReport);
  }

  /**
   * Creates and configures the ArgumentParser for this sample.
   *
   * @return the configured ArgumentParser.
   */
  private static ArgumentParser createArgumentParser() {
    ArgumentParser parser =
        ArgumentParsers.newFor("CreateReport")
            .build()
            .defaultHelp(true)
            .description("Creates a new report for the given curator account.");

    // Required arguments.
    parser
        .addArgument("-a", "--account_id")
        .help("The account ID of the curator that will create the report.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-d", "--display_name")
        .help("The display name of the report to be created.")
        .required(true);
    parser
        .addArgument("--dimensions")
        .help("The space-delimited list of dimensions to include in the report definition " +
            "(for example: DATE BUYER_NAME). For a listing of possible values, see: " +
            "https://developers.google.com/authorized-buyers/curation/apis/curationpartners/reference/rest/v1/curators.reports#dimension")
        .required(true)
        .nargs("+");
    parser
        .addArgument("--metrics")
        .help("The space-delimited list of metrics to include in the report definition " +
            "(for example: IMPRESSIONS CLICKS). For a listing of possible values, see: " +
            "https://developers.google.com/authorized-buyers/curation/apis/curationpartners/reference/rest/v1/curators.reports#metric")
        .required(true)
        .nargs("+");

    // Optional arguments.
    parser
        .addArgument("--relative_date_range")
        .help("The relative date range for the report to include in the report definition. (for example: LAST_7_DAYS, TODAY, YESTERDAY). " +
            "Defaults to LAST_7_DAYS if unspecified. For a listing of possible values, see: " +
            "https://developers.google.com/authorized-buyers/curation/apis/curationpartners/reference/rest/v1/curators.reports#relativedaterange")
        .setDefault("LAST_7_DAYS");

    return parser;
  }

  public static void main(String[] args) {
    ArgumentParser parser = createArgumentParser();

    Namespace parsedArgs = null;
    try {
      parsedArgs = parser.parseArgs(args);
    } catch (ArgumentParserException ex) {
      parser.handleError(ex);
      System.exit(1);
    }

    CurationPartners client = null;
    try {
      client = Utils.getCurationPartnersClient();
    } catch (IOException ex) {
      System.out.printf("Unable to create Curation Partners API service:%n%s", ex);
      System.out.println("Did you specify a valid path to a service account key file?");
      System.exit(1);
    } catch (GeneralSecurityException ex) {
      System.out.printf("Unable to establish secure HttpTransport:%n%s", ex);
      System.exit(1);
    }

    Long accountId = parsedArgs.getLong("account_id");
    String displayName = parsedArgs.getString("display_name");
    List<String> dimensions = parsedArgs.getList("dimensions");
    List<String> metrics = parsedArgs.getList("metrics");
    String relativeDateRange = parsedArgs.getString("relative_date_range");

    try {
      execute(client, accountId, displayName, dimensions, metrics, relativeDateRange);
    } catch (IOException ex) {
      System.out.printf("Curation Partners API returned error response:%n%s", ex);
      System.exit(1);
    }
  }
}

修改现有报告

如需修改现有报告,请使用 curators.reports.patch 方法。如需指定要更新的字段,请使用 updateMask 查询参数。

以下示例会发出 PATCH 请求,以更新报告的显示名称和相对日期范围:

REST

请求

curl --request PATCH \
  'https://curationpartners.googleapis.com/v1/curators/ACCOUNT_ID/reports/123456789?updateMask=displayName,reportDefinition.dateRange.relative' \
  --header 'Authorization: Bearer ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
    "displayName": "Updated Data Segment Performance",
    "reportDefinition": {
      "dateRange": {
        "relative": "THIS_MONTH_TO_DATE"
      }
    }
  }' \
  --compressed

响应

{
  "name": "curators/ACCOUNT_ID/reports/123456789",
  "reportId": "123456789",
  "displayName": "Updated Data Segment Performance",
  "reportDefinition": {
    "dimensions": [
      "DATE",
      "CURATION_DATA_SEGMENT_ID"
    ],
    "metrics": [
      "IMPRESSIONS",
      "CLICKS",
      "SPEND",
      "CURATION_PARTNER_FEE"
    ],
    "dateRange": {
      "relative": "THIS_MONTH_TO_DATE"
    },
    "timeZoneSource": "UTC"
  },
  "createTime": "2026-08-01T10:00:00Z",
  "updateTime": "2026-08-01T10:10:00Z",
  "locale": "en"
}

Java

/*
 * Copyright (c) 2026 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.api.services.samples.curationpartners.v1.curators.reports;

import com.google.api.services.curationpartners.v1.CurationPartners;
import com.google.api.services.curationpartners.v1.model.DateRange;
import com.google.api.services.curationpartners.v1.model.Report;
import com.google.api.services.curationpartners.v1.model.ReportDefinition;
import com.google.api.services.samples.curationpartners.v1.Utils;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

public class PatchReport {

  private PatchReport() {}

  /**
   * Executes the patch operation for a report.
   *
   * @param curationPartnersClient the initialized Curation Partners API client.
   * @param accountId the account ID of the curator that created the report.
   * @param reportId the resource ID of the report to update.
   * @param displayName the modified display name for the report (or null if not being modified).
   * @param relativeDateRange the modified relative date range for the report definition (or null
   *     if not being modified).
   * @param dimensions the modified list of dimensions for the report definition (or null if not
   *     being modified).
   * @param metrics the modified list of metrics for the report definition (or null if not being
   *     modified).
   * @throws IOException if the API returns an error.
   */
  public static void execute(
      CurationPartners curationPartnersClient,
      Long accountId,
      String reportId,
      String displayName,
      String relativeDateRange,
      List<String> dimensions,
      List<String> metrics)
      throws IOException {

    String name = String.format("curators/%d/reports/%s", accountId, reportId);

    List<String> patchedFields = new ArrayList<>();
    Report patchedReport = new Report();

    if (displayName != null) {
      patchedReport.setDisplayName(displayName);
      patchedFields.add("displayName");
    }

    ReportDefinition reportDefinition = new ReportDefinition();
    if (relativeDateRange != null) {
      reportDefinition.setDateRange(new DateRange().setRelative(relativeDateRange));
      patchedFields.add("reportDefinition.dateRange.relative");
    }
    if (dimensions != null) {
      reportDefinition.setDimensions(dimensions);
      patchedFields.add("reportDefinition.dimensions");
    }
    if (metrics != null) {
      reportDefinition.setMetrics(metrics);
      patchedFields.add("reportDefinition.metrics");
    }
    // Set the ReportDefinition on the patched Report unconditionally. Any fields not
    // explicitly specified in the updateMask will be ignored by the API.
    patchedReport.setReportDefinition(reportDefinition);

    if (patchedFields.isEmpty()) {
      System.out.println("No fields specified to update.");
      return;
    }

    String updateMask = String.join(",", patchedFields);

    System.out.printf("Patching report with name \"%s\".%n", name);

    // Patch the report.
    Report returnedReport =
        curationPartnersClient
            .curators()
            .reports()
            .patch(name, patchedReport)
            .setUpdateMask(updateMask)
            .execute();

    System.out.println("Successfully patched report:");
    Utils.jsonPrettyPrint(returnedReport);
  }

  /**
   * Creates and configures the ArgumentParser for this sample.
   *
   * @return the configured ArgumentParser.
   */
  private static ArgumentParser createArgumentParser() {
    ArgumentParser parser =
        ArgumentParsers.newFor("PatchReport")
            .build()
            .defaultHelp(true)
            .description("Updates a specified report.");

    // Required arguments.
    parser
        .addArgument("-a", "--account_id")
        .help("The account ID of the curator that created the report.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-r", "--report_id")
        .help("The resource ID of the report to update.")
        .required(true);

    // Optional arguments.
    parser
        .addArgument("-d", "--display_name")
        .help("The modified display name of the report.");
    parser
        .addArgument("--relative_date_range")
        .help("The modified relative date range for the report definition (for example: " +
            "LAST_7_DAYS, TODAY, YESTERDAY). For a listing of possible values, see: " +
            "https://developers.google.com/authorized-buyers/curation/apis/curationpartners/reference/rest/v1/curators.reports#relativedaterange");
    parser
        .addArgument("--dimensions")
        .help("A space-delimited list of modified dimensions for the report definition (for " +
            "example: DATE, BUYER_NAME). For a listing of possible values, see: " +
            "https://developers.google.com/authorized-buyers/curation/apis/curationpartners/reference/rest/v1/curators.reports#dimension")
        .nargs("+");
    parser
        .addArgument("--metrics")
        .help("A space-delimited list of modified metrics for the report definition (for " +
            "example: IMPRESSIONS CLICKS). For a listing of possible values, see: " +
            "https://developers.google.com/authorized-buyers/curation/apis/curationpartners/reference/rest/v1/curators.reports#metric")
        .nargs("+");

    return parser;
  }

  public static void main(String[] args) {
    ArgumentParser parser = createArgumentParser();
    Namespace parsedArgs = null;
    try {
      parsedArgs = parser.parseArgs(args);
    } catch (ArgumentParserException e) {
      parser.handleError(e);
      System.exit(1);
    }

    CurationPartners client = null;
    try {
      client = Utils.getCurationPartnersClient();
    } catch (IOException ex) {
      System.out.printf("Unable to create Curation Partners API service:%n%s", ex);
      System.out.println("Did you specify a valid path to a service account key file?");
      System.exit(1);
    } catch (GeneralSecurityException ex) {
      System.out.printf("Unable to establish secure HttpTransport:%n%s", ex);
      System.exit(1);
    }

    Long accountId = parsedArgs.getLong("account_id");
    String reportId = parsedArgs.getString("report_id");
    String displayName = parsedArgs.getString("display_name");
    String relativeDateRange = parsedArgs.getString("relative_date_range");
    List<String> dimensions = parsedArgs.getList("dimensions");
    List<String> metrics = parsedArgs.getList("metrics");

    try {
      execute(
          client, accountId, reportId, displayName, relativeDateRange, dimensions, metrics);
    } catch (IOException e) {
      System.out.printf("Curation Partners API returned error response:%n%s", e);
      System.exit(1);
    }
  }
}

删除报告

如需删除不再需要的报告,请使用 curators.reports.delete 方法。删除报告后,您将无法再使用该报告运行后续报告。您也无法使用 curators.reports.get 或 curators.reports.list 方法检索报告。

以下示例发送 DELETE 请求以删除指定报告:

REST

请求

curl --request DELETE \
  'https://curationpartners.googleapis.com/v1/curators/ACCOUNT_ID/reports/123456789' \
  --header 'Authorization: Bearer ACCESS_TOKEN' \
  --header 'Accept: application/json' \
  --compressed

响应

{}

Java

/*
 * Copyright (c) 2026 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.api.services.samples.curationpartners.v1.curators.reports;

import com.google.api.services.curationpartners.v1.CurationPartners;
import com.google.api.services.samples.curationpartners.v1.Utils;
import java.io.IOException;
import java.security.GeneralSecurityException;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

public class DeleteReport {

  /**
   * Executes the delete operation for a report.
   *
   * @param curationPartnersClient the initialized Curation Partners API client.
   * @param accountId the account ID of the curator that created the report.
   * @param reportId the resource ID of the report to delete.
   * @throws IOException if the API returns an error.
   */
  public static void execute(
      CurationPartners curationPartnersClient, Long accountId, String reportId)
      throws IOException {
    String name = String.format("curators/%s/reports/%s", accountId, reportId);

    System.out.printf("Deleting report with name \"%s\".%n", name);

    // Delete the specified report.
    curationPartnersClient.curators().reports().delete(name).execute();

    System.out.println("Successfully deleted report.");
  }

  /**
   * Creates and configures the ArgumentParser for this sample.
   *
   * @return the configured ArgumentParser.
   */
  private static ArgumentParser createArgumentParser() {
    ArgumentParser parser =
        ArgumentParsers.newFor("DeleteReport")
            .build()
            .defaultHelp(true)
            .description("Deletes a specified report.");

    // Required arguments.
    parser
        .addArgument("-a", "--account_id")
        .help("The account ID of the curator that created the report.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-r", "--report_id")
        .help("The resource ID of the report to delete.")
        .required(true);

    return parser;
  }

  public static void main(String[] args) {
    ArgumentParser parser = createArgumentParser();

    Namespace parsedArgs = null;
    try {
      parsedArgs = parser.parseArgs(args);
    } catch (ArgumentParserException ex) {
      parser.handleError(ex);
      System.exit(1);
    }

    CurationPartners client = null;
    try {
      client = Utils.getCurationPartnersClient();
    } catch (IOException ex) {
      System.out.printf("Unable to create Curation Partners API service:%n%s", ex);
      System.out.println("Did you specify a valid path to a service account key file?");
      System.exit(1);
    } catch (GeneralSecurityException ex) {
      System.out.printf("Unable to establish secure HttpTransport:%n%s", ex);
      System.exit(1);
    }

    try {
      execute(
          client,
          parsedArgs.getLong("account_id"),
          parsedArgs.getString("report_id"));
    } catch (IOException ex) {
      System.out.printf("Curation Partners API returned error response:%n%s", ex);
      System.exit(1);
    }
  }
}

后续步骤