Google Ads API is returning to beta status. Please read our blog post for more details.

创建购物信息组

通过购物信息组,您可以对产品进行分组,即界面中所称的“产品组”。您可以使用多个维度进行分组,方便设置出价或排除产品。分组时,请考虑使用这样的树状结构:在第一级,将产品按条件划分为全新、二手和其他产品条件;然后在第二级,将其他产品条件中的产品按品牌划分为“CoolBrand”产品、“CheapBrand”和其他品牌。

树状结构中的每个节点要么是一个子类,要么是一个单元,具体由 ListingGroupType 指定。子类会在树状结构中延伸出一个新的级别,相当于树枝,而单元则是树状结构上的树叶。每个子类之间必须始终完全分割开来,因此必须包含一个代表其他的节点。在下面的示例中,root 和 Product Condition: (Other) 节点都是子类。这种包含子类和单元的树状结构允许您在单元级别设置出价,并确保每个产品属于且只属于树状结构中的一个单元节点。

节点是 ListingGroupInfo 类的对象,该类包含的 ListingGroupType 字段用于指示节点是单元,还是子类。将 ListingGroupInfo 设置为 AdGroupCriterionlisting_group,会将其链接到 AdGroup

设置每次点击费用人工出价

您只能在单元节点上设置 AdGroupCriterioncpc_bid_micros。在子类节点上尝试执行此项设置操作,将会失败并显示错误。

信息维度

ListingGroupInfo 还具有 case_value,它是一个 ListingDimensionInfo,包含几种维度类型中的一种。ListingGroupInfo 表示与您的产品相关联的值,例如产品/服务 ID、品牌或产品条件。有关可用的 ListingDimensionInfo 类型的完整说明,请参阅参考文档

子类的每个子级都必须具有属于相同 ListingDimensionInfo 子类型的 case_value,但根节点除外,它没有 case_value

另请注意,每个子类必须包含一个正确类型的“空”case_value。该子级通常称为其他,因为它表示该 ListingDimensionInfo 的“所有其他值”。

如需了解更多详情,请查看下面为购物信息组树状结构添加第一级条件的代码段。

Java
private void runExample(
    GoogleAdsClient googleAdsClient,
    long customerId,
    long adGroupId,
    boolean replaceExistingTree) {
  // 1) Optional: Removes the existing listing group tree, if it already exists on the ad group.
  if (replaceExistingTree) {
    removeListingGroupTree(googleAdsClient, customerId, adGroupId);
  }
  // Creates a list of ad group criterion to add.q
  List<AdGroupCriterionOperation> operations = new ArrayList<>();

  // 2) Constructs the listing group tree "root" node.

  // Subdivision node: (Root node)
  AdGroupCriterion adGroupCriterionRoot =
      createListingGroupSubdivisionRoot(customerId, adGroupId, -1L);
  // Get the resource name that will be used for the root node.
  // This resource has not been created yet and will include the temporary ID as part of the
  // criterion ID.
  String adGroupCriterionResourceNameRoot = adGroupCriterionRoot.getResourceName();
  operations.add(AdGroupCriterionOperation.newBuilder().setCreate(adGroupCriterionRoot).build());

  // 3) Construct the listing group unit nodes for NEW, USED and other

  // Biddable Unit node: (Condition NEW node)
  // * Product Condition: NEW
  // * CPC bid: $0.20
  AdGroupCriterion adGroupCriterionConditionNew =
      createListingGroupUnitBiddable(
          customerId,
          adGroupId,
          adGroupCriterionResourceNameRoot,
          ListingDimensionInfo.newBuilder()
              .setProductCondition(
                  ProductConditionInfo.newBuilder().setCondition(ProductCondition.NEW).build())
              .build(),
          200_000L);
  operations.add(
      AdGroupCriterionOperation.newBuilder().setCreate(adGroupCriterionConditionNew).build());

  // Biddable Unit node: (Condition USED node)
  // * Product Condition: USED
  // * CPC bid: $0.10
  AdGroupCriterion adGroupCriterionConditionUsed =
      createListingGroupUnitBiddable(
          customerId,
          adGroupId,
          adGroupCriterionResourceNameRoot,
          ListingDimensionInfo.newBuilder()
              .setProductCondition(
                  ProductConditionInfo.newBuilder().setCondition(ProductCondition.USED).build())
              .build(),
          100_000L);
  operations.add(
      AdGroupCriterionOperation.newBuilder().setCreate(adGroupCriterionConditionUsed).build());

  // Sub-division node: (Condition "other" node)
  // * Product Condition: (not specified)
  AdGroupCriterion adGroupCriterionConditionOther =
      createListingGroupSubdivision(
          customerId,
          adGroupId,
          -2L,
          adGroupCriterionResourceNameRoot,
          ListingDimensionInfo.newBuilder()
              // All sibling nodes must have the same dimension type, even if they don't contain a
              // bid.
              // parent
              .setProductCondition(ProductConditionInfo.newBuilder().build())
              .build());
  // Gets the resource name that will be used for the condition other node.
  // This resource has not been created yet and will include the temporary ID as part of the
  // criterion ID.
  String adGroupCriterionResourceNameConditionOther =
      adGroupCriterionConditionOther.getResourceName();
  operations.add(
      AdGroupCriterionOperation.newBuilder().setCreate(adGroupCriterionConditionOther).build());

  // 4) Constructs the listing group unit nodes for CoolBrand, CheapBrand and other

  // Biddable Unit node: (Brand CoolBrand node)
  // * Brand: CoolBrand
  // * CPC bid: $0.90
  AdGroupCriterion adGroupCriterionBrandCoolBrand =
      createListingGroupUnitBiddable(
          customerId,
          adGroupId,
          adGroupCriterionResourceNameConditionOther,
          ListingDimensionInfo.newBuilder()
              .setListingBrand(
                  ListingBrandInfo.newBuilder().setValue(StringValue.of("CoolBrand")).build())
              .build(),
          900_000L);
  operations.add(
      AdGroupCriterionOperation.newBuilder().setCreate(adGroupCriterionBrandCoolBrand).build());

  // Biddable Unit node: (Brand CheapBrand node)
  // * Brand: CheapBrand
  // * CPC bid: $0.01
  AdGroupCriterion adGroupCriterionBrandCheapBrand =
      createListingGroupUnitBiddable(
          customerId,
          adGroupId,
          adGroupCriterionResourceNameConditionOther,
          ListingDimensionInfo.newBuilder()
              .setListingBrand(
                  ListingBrandInfo.newBuilder().setValue(StringValue.of("CheapBrand")).build())
              .build(),
          10_000L);
  operations.add(
      AdGroupCriterionOperation.newBuilder().setCreate(adGroupCriterionBrandCheapBrand).build());

  // Biddable Unit node: (Brand other node)
  // * Brand: CheapBrand
  // * CPC bid: $0.01
  AdGroupCriterion adGroupCriterionBrandOther =
      createListingGroupUnitBiddable(
          customerId,
          adGroupId,
          adGroupCriterionResourceNameConditionOther,
          ListingDimensionInfo.newBuilder()
              .setListingBrand(ListingBrandInfo.newBuilder().build())
              .build(),
          50_000L);
  operations.add(
      AdGroupCriterionOperation.newBuilder().setCreate(adGroupCriterionBrandOther).build());

  // Issues a mutate request to add the ad group criterion to the ad group.
  try (AdGroupCriterionServiceClient adGroupCriterionServiceClient =
      googleAdsClient.getLatestVersion().createAdGroupCriterionServiceClient()) {
    List<MutateAdGroupCriterionResult> mutateAdGroupCriteriaResults =
        adGroupCriterionServiceClient
            .mutateAdGroupCriteria(Long.toString(customerId), operations)
            .getResultsList();
    for (MutateAdGroupCriterionResult mutateAdGroupCriterionResult :
        mutateAdGroupCriteriaResults) {
      System.out.printf(
          "Added ad group criterion for listing group with resource name: '%s'%n",
          mutateAdGroupCriterionResult.getResourceName());
    }
  }
}

ListingDimensionInfo 的可用维度

有多个信息维度可以是广告组一级信息组的一部分,也可以是广告系列一级信息范围的一部分。

以下 ListingDimensionInfo 类型可用于购物广告系列:

临时 ID

在服务器处理了创建广告组条件的 mutate 请求后,系统才会向这些条件分配 ID。不过,ListingGroupInfo 在处理完成前都是无效的,因此每当您创建子类时,都必须在同一请求中至少创建一个子级子类和一个其他节点。

要为同一个父级请求中创建的子节点设置 ListingGroupInfoparent_criterion_id,您可以使用临时条件 ID。这些临时 ID 只是具有本地唯一性的标识符,不是具有全局唯一性的标识符,仅可在单个 mutate 请求的上下文中应用。任何负整数都可以用作临时 ID。在代码示例中,根 ListingGroupInfo 的 ID 设置为 -1

处理请求时,每个 AdGroupCriterion 都会照常分配一个正整数的全局 ID。

代码示例

如需探索每种语言的代码示例,请点击下面的链接。

语言 文件名
Java AddShoppingProductListingGroupTree.java