Google Ads 附加地址信息

要创建 Google Ads 附加地址信息,您需要创建商家资料,并填充所有营业地点的地址。然后,将商家资料与您的附加地址信息 Feed 相关联,以创建附加地址信息。

商家资料

商家资料是所有 Google 产品中营业地点的中央代码库。不必担心让商家资料营业地点与 Google Ads 附加地址信息保持同步。您只需执行必需的 Feed 对象一次性设置。 Google Ads 会自动使其附加地址信息与商家资料中的最新数据保持同步。

您可以通过以下两种方式在商家资料中创建营业地点。

  1. 您可以使用商家资料界面创建营业地点。如果您遵循此方法,则可以直接使用 Google Ads API 将营业地点关联到广告
  2. 您可以使用 Business Profile API 以编程方式创建营业地点。

使用 Business Profile API

要开始使用 Business Profile API,请访问其首页。对于与 Google Ads 相关联的营业地点,我们建议使用商家帐号,而不是个人帐号。通过使用企业帐号,您可以与其他用户共享访问权限,而不必共享您的个人帐号详细信息。

要使用 Business Profile API 以编程方式创建营业地点,

  1. 首先,下载客户端库。 按照基本设置指南创建要与 Business Profile API 搭配使用的 OAuth 凭据。

  2. 使用 Business Profile API 列出您拥有的或具有管理权限的所有帐号。选择要使用的帐号。

  3. 使用 Business Profile API 创建营业地点

创建与您的商家资料相关联的新附加地址信息 Feed

要创建新的附加地址信息 Feed,首先要创建 Feed 对象。执行 FeedService.MutateFeeds create 操作以创建 Feed。代码段如下所示。

Java

// Creates a feed that will sync to the Business Profile account. Do not add FeedAttributes to
// this object as Google Ads will add them automatically because this will be a system generated
// feed.
Feed.Builder businessProfileFeed =
    Feed.newBuilder()
        .setName("Business Profile feed #" + getPrintableDateTime())
        // Configures the location feed populated from Business Profile Locations.
        .setPlacesLocationFeedData(placesLocationFeedData)
        // Since this feed's feed items will be managed by Google,
        // you must set its origin to GOOGLE.
        .setOrigin(FeedOrigin.GOOGLE);

FeedOperation operation = FeedOperation.newBuilder().setCreate(businessProfileFeed).build();
      

C#

private static string CreateBusinessProfileFeed(GoogleAdsClient client, long customerId,
    string businessProfileEmailAddress, string businessAccountId,
    string businessProfileAccessToken)
{
    // Optional: Delete all existing location extension feeds. This is an optional step,
    // and is required for this code example to run correctly more than once.
    // 1. Google Ads only allows one location extension feed per email address.
    // 2. A Google Ads account cannot have a location extension feed and an affiliate
    // location extension feed at the same time.
    DeleteLocationExtensionFeeds(client, customerId);

    // Get the FeedServiceClient.
    FeedServiceClient feedService = client.GetService(Services.V11.FeedService);

    // Creates a feed that will sync to the Business Profile account specified by
    // businessProfileEmailAddress. Do not add FeedAttributes to this object as Google Ads
    // will add them automatically because this will be a system generated feed.
    Feed businessProfileFeed = new Feed()
    {
        Name = "Business Profile feed #" + ExampleUtilities.GetRandomString(),

        PlacesLocationFeedData = new PlacesLocationFeedData()
        {
            EmailAddress = businessProfileEmailAddress,
            // If the EmailAddress is for a Business Profile manager instead of the
            // Business Profile account owner, then set BusinessAccountId to the Google+
            // Page ID of a location for which the manager has access. This information is
            // available through the Business Profile API. See
            // https://developers.google.com/my-business/reference/rest/v4/accounts.locations#locationkey
            // for details.
            BusinessAccountId = string.IsNullOrEmpty(businessAccountId) ?
                null : businessAccountId,
            // Used to filter Business Profile listings by labels. If entries exist in
            // label_filters, only listings that have at least one of the labels set are
            // candidates to be synchronized into FeedItems. If no entries exist in
            // label_filters, then all listings are candidates for syncing.
            LabelFilters = { "Stores in New York" },
            // Sets the authentication info to be able to connect Google Ads to the
            // Business Profile account.
            OauthInfo = new OAuthInfo()
            {
                HttpMethod = "GET",
                HttpRequestUrl = GOOGLE_ADS_SCOPE,
                HttpAuthorizationHeader = $"Bearer {businessProfileAccessToken}"
            },
        },
        // Since this feed's feed items will be managed by Google,
        // you must set its origin to GOOGLE.
        Origin = FeedOrigin.Google
    };

    FeedOperation operation = new FeedOperation()
    {
        Create = businessProfileFeed
    };

    // Adds the feed.
    MutateFeedsResponse response =
        feedService.MutateFeeds(customerId.ToString(), new[] { operation });

    // Displays the results.
    string businessProfileFeedResourceName = response.Results[0].ResourceName;
    Console.WriteLine($"Business Profile feed created with resource name: " +
        $"{businessProfileFeedResourceName}.");
    return businessProfileFeedResourceName;
}
      

PHP

private static function createFeed(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $businessProfileEmail,
    string $businessProfileAccessToken,
    string $businessAccountIdentifier
) {

    $businessProfileFeed = new Feed([
        'name' => 'Business Profile feed #' . Helper::getPrintableDatetime(),
        'origin' => FeedOrigin::GOOGLE,
        'places_location_feed_data' => new PlacesLocationFeedData([
            'email_address' => $businessProfileEmail,
            'business_account_id' => $businessAccountIdentifier,
            // Used to filter Business Profile listings by labels. If entries exist in
            // label_filters, only listings that have at least one of the labels set are
            // candidates to be synchronized into FeedItems. If no entries exist in
            // label_filters, then all listings are candidates for syncing.
            'label_filters' => ['Stores in New York'],
            // Sets the authentication info to be able to connect Google Ads to the Business
            // Profile account.
            'oauth_info' => new OAuthInfo([
                'http_method' => 'GET',
                'http_request_url' => self::GOOGLE_ADS_SCOPE,
                'http_authorization_header' => 'Bearer ' . $businessProfileAccessToken
            ])

        ])
    ]);
    // Creates a feed operation.
    $feedOperation = new FeedOperation();
    $feedOperation->setCreate($businessProfileFeed);

    // Issues a mutate request to add the feed and print its information.
    // Since it is a system generated feed, Google Ads will automatically:
    // 1. Set up the feed attributes on the feed.
    // 2. Set up a feed mapping that associates the feed attributes of the feed with the
    //    placeholder fields of the LOCATION placeholder type.
    $feedServiceClient = $googleAdsClient->getFeedServiceClient();
    $response = $feedServiceClient->mutateFeeds(
        $customerId,
        [$feedOperation]
    );
    $businessProfileFeedResourceName = $response->getResults()[0]->getResourceName();
    printf(
        "Business Profile feed created with resource name: '%s'.%s",
        $businessProfileFeedResourceName,
        PHP_EOL
    );

    return $businessProfileFeedResourceName;
}
      

Python

feed_operation = client.get_type("FeedOperation")
business_profile_feed = feed_operation.create
business_profile_feed.name = f"Business Profile Feed #{uuid4()}"
# Configure the location feed populated from Business Profile Locations.
business_profile_feed.places_location_feed_data.email_address = (
    business_profile_email
)

if business_account_id is not None:
    business_profile_feed.places_location_feed_data.business_account_id = (
        business_account_id
    )

# Used to filter Business Profile listings by labels. If entries exist in
# label_filters, only listings that have at least one of the labels set are
# candidates to be synchronized into FeedItems. If no entries exist in
# label_filters, then all listings are candidates for syncing.
business_profile_feed.places_location_feed_data.label_filters.append(
    "Stores in New York"
)

# Set the authentication info to be able to connect Google Ads to the
# Business Profile account.
business_profile_feed.places_location_feed_data.oauth_info.http_method = (
    "GET"
)
business_profile_feed.places_location_feed_data.oauth_info.http_request_url = (
    DEFAULT_OAUTH2_SCOPE
)
business_profile_feed.places_location_feed_data.oauth_info.http_authorization_header = (
    f"Bearer {business_profile_access_token}"
)
# Since this feed's feed items will be managed by Google, you must set its
# origin to GOOGLE.
business_profile_feed.origin = client.enums.FeedOriginEnum.GOOGLE

# Optional: Delete all existing location extension feeds. This is an
# optional step, and is required for this code example to run correctly
# more than once; Google Ads only allows one location extension feed
# per email address, and a Google Ads account cannot have a location
# extension feed and an affiliate location extension feed at the same
# time.
_delete_location_extension_feeds(client, customer_id)

# Add the feed. Since it is a system generated feed, Google Ads will
# automatically:
# 1. Set up the FeedAttributes on the feed.
# 2. Set up a FeedMapping that associates the FeedAttributes of the feed
#   with the placeholder fields of the LOCATION placeholder type.
feed_response = feed_service.mutate_feeds(
    customer_id=customer_id, operations=[feed_operation]
)
feed_resource_name = feed_response.results[0].resource_name
print(
    "Business Profile feed created with resource name "
    f"'{feed_resource_name}'."
)
      

Ruby

def create_feed(
  client,
  customer_id,
  business_profile_email_address,
  business_profile_access_token,
  business_account_identifier)
  # Creates a feed operation.
  operation = client.operation.create_resource.feed do |feed|
    feed.name = "Business Profile feed #{(Time.new.to_f * 1000).to_i}"
    feed.origin = :GOOGLE
    feed.places_location_feed_data = client.resource.places_location_feed_data do |data|
      data.email_address = business_profile_email_address
      data.business_account_id = business_account_identifier
      data.label_filters << "Stores in New York"
      data.oauth_info = client.resource.o_auth_info do |oauth|
        oauth.http_method = "GET"
        oauth.http_request_url = "https://www.googleapis.com/auth/adwords"
        oauth.http_authorization_header = "Bearer #{business_profile_access_token}"
      end
    end
  end

  # Issues a mutate request to add the feed and print its information.
  # Since it is a system generated feed, Google Ads will automatically:
  # 1. Set up the feed attributes on the feed.
  # 2. Set up a feed mapping that associates the feed attributes of the feed with the
  #    placeholder fields of the LOCATION placeholder type.
  response = client.service.feed.mutate_feeds(
    customer_id: customer_id,
    operations: [operation],
  )

  # Prints out the Business Profile feed resource name.
  business_profile_feed_resource_name = response.results.first.resource_name
  puts "Business Profile feed created with resource name: #{business_profile_feed_resource_name}"

  business_profile_feed_resource_name
end
      

Perl

# Create a feed that will sync to the Business Profile account specified by
# $business_profile_email. Do not add FeedAttributes to this object as Google Ads
# will add them automatically because this will be a system generated feed.
my $business_profile_feed = Google::Ads::GoogleAds::V11::Resources::Feed->new(
  {
    name => "Business Profile feed #" . uniqid(),
    # Configure the location feed populated from Business Profile Locations.
    placesLocationFeedData =>
      Google::Ads::GoogleAds::V11::Resources::PlacesLocationFeedData->new({
        emailAddress      => $business_profile_email,
        businessAccountId => $business_profile_account_id,
        # Used to filter Business Profile listings by labels. If entries exist in
        # label_filters, only listings that have at least one of the labels set are
        # candidates to be synchronized into FeedItems. If no entries exist in
        # label_filters, then all listings are candidates for syncing.
        labelFilters => ["Stores in New York"],
        # Set the authentication info to be able to connect Google Ads to the
        # Business Profile account.
        oauthInfo => Google::Ads::GoogleAds::V11::Resources::OAuthInfo->new({
            httpMethod     => "GET",
            httpRequestUrl =>
              Google::Ads::GoogleAds::Constants::DEFAULT_OAUTH2_SCOPE,
            httpAuthorizationHeader => "Bearer " .
              $business_profile_access_token
          })}
      ),
    # Since this feed's feed items will be managed by Google, you must set its
    # origin to GOOGLE.
    origin => GOOGLE
  });
      

您需要填充以下特定于附加地址信息 Feed 的字段:

特性 必需 说明
origin 由于附加地址信息 Feed 是系统生成的,因此您需要将 origin 字段设置为 GOOGLE
attributes 请勿为 Feed 指定任何 attributes。这是系统生成的 Feed,因此 Google Ads 会自动为您创建属性。
places_location_feed_data 如果将 places_location_feed_data 属性设置为您 Feed 中的 PlacesLocationFeedData 对象,Google Ads 就会执行以下操作:
  • 将您的商家资料与 Google Ads 帐号相关联。
  • 自动为您的 Feed 创建 Feed 属性。
  • 自动创建 FeedMapping LOCATION_EXTENSION_TARGETING 条件类型。
  • (可选)限制 Google Ads 从您的商家资料同步的营业地点组。

PlacesLocationFeedData的属性

特性 必需 说明
email_address 您的商家资料所有者或其管理员的电子邮件地址。此值必须与 oauth_info 中提供的电子邮件地址一致。
oauth_info 授予 Google Ads 帐号对商家资料的访问权限的 OAuth2 信息。如果您不熟悉 OAuth2,请先阅读身份验证指南
business_account_id 要使用其营业地点的受管理商家的 ID。 如果您使用的是 Business Profile API,可以从 Accountnameaccount_id 部分获取此 ID。否则,您可以从指定营业地点组的营业地点组信息部分复制 LOCATION_GROUP_ID 部分。
business_name_filter 要同步到 Google Ads 的商家名称。
category_filters 要同步到 Google Ads 的商家信息类别。
label_filters 要同步到 Google Ads 的商家信息标签。

PlacesLocationFeedData的 oauth_info 属性

特性 说明
http_method GET 用于获取授权信息的 HTTP 方法。
http_request_url https://www.googleapis.com/auth/adwords Google Ads API 用于对商家资料的请求进行授权的 OAuth 范围
http_authorization_header Bearer OAUTH_ACCESS_TOKEN 包含 OAuth 访问令牌的授权标头,可授予您的 Google Ads 帐号从您的商家资料帐号中读取数据的权限。用 PlacesLocationFeedDatahttp_request_url 和与 http_request_url 匹配的范围替换通过 OAuth 凭据生成的访问令牌,以代替 OAUTH_ACCESS_TOKEN

等待 Feed 准备就绪

创建 Feed 后,Google Ads 将创建 Feed 属性和 FeedMapping。之后,它会通过创建与商家资料中的营业地点对应的 FeedItem 对象来填充 Feed 内容。

您需要等到创建 FeedMapping 才能确保正确设置 Feed,并且可用于后续步骤。这可以通过尝试检索 placeholder_type 等于 LOCATION 的相关 Feed 的 FeedMapping 来实现。

Java

try (FeedServiceClient feedServiceClient =
    googleAdsClient.getLatestVersion().createFeedServiceClient()) {
  // Adds the feed. Since it is a system generated feed, Google Ads will automatically:
  // 1. Set up the FeedAttributes on the feed.
  // 2. Set up a FeedMapping that associates the FeedAttributes of the feed
  // with the placeholder fields of the LOCATION placeholder type.
  MutateFeedsResponse response =
      feedServiceClient.mutateFeeds(Long.toString(customerId), ImmutableList.of(operation));
  String businessProfileFeedResourceName = response.getResults(0).getResourceName();
  System.out.printf(
      "Business Profile feed created with resource name: %s%n",
      businessProfileFeedResourceName);
      

C#

private static FeedMapping GetBusinessProfileFeedMapping(GoogleAdsClient client,
    long customerId, string businessProfileFeedResourceName)
{
    // Get the GoogleAdsService.
    GoogleAdsServiceClient googleAdsService = client.GetService(
        Services.V11.GoogleAdsService);

    // Create the query.
    string query = $"SELECT feed_mapping.resource_name, feed_mapping.status FROM " +
        $"feed_mapping WHERE feed_mapping.feed = '{businessProfileFeedResourceName}' and " +
        $"feed_mapping.status = ENABLED and feed_mapping.placeholder_type = LOCATION" +
        $" LIMIT 1";

    // Issue a search request.
    PagedEnumerable<SearchGoogleAdsResponse, GoogleAdsRow> result =
        googleAdsService.Search(customerId.ToString(), query);

    // Display the results.
    GoogleAdsRow googleAdsRow = result.FirstOrDefault();
    return (googleAdsRow == null) ? null : googleAdsRow.FeedMapping;
}
      

PHP

// Issues a mutate request to add the feed and print its information.
// Since it is a system generated feed, Google Ads will automatically:
// 1. Set up the feed attributes on the feed.
// 2. Set up a feed mapping that associates the feed attributes of the feed with the
//    placeholder fields of the LOCATION placeholder type.
$feedServiceClient = $googleAdsClient->getFeedServiceClient();
$response = $feedServiceClient->mutateFeeds(
    $customerId,
    [$feedOperation]
);
$businessProfileFeedResourceName = $response->getResults()[0]->getResourceName();
printf(
    "Business Profile feed created with resource name: '%s'.%s",
    $businessProfileFeedResourceName,
    PHP_EOL
);

return $businessProfileFeedResourceName;
      

Python

# Add the feed. Since it is a system generated feed, Google Ads will
# automatically:
# 1. Set up the FeedAttributes on the feed.
# 2. Set up a FeedMapping that associates the FeedAttributes of the feed
#   with the placeholder fields of the LOCATION placeholder type.
feed_response = feed_service.mutate_feeds(
    customer_id=customer_id, operations=[feed_operation]
)
feed_resource_name = feed_response.results[0].resource_name
print(
    "Business Profile feed created with resource name "
    f"'{feed_resource_name}'."
)
      

Ruby

# Issues a mutate request to add the feed and print its information.
# Since it is a system generated feed, Google Ads will automatically:
# 1. Set up the feed attributes on the feed.
# 2. Set up a feed mapping that associates the feed attributes of the feed with the
#    placeholder fields of the LOCATION placeholder type.
response = client.service.feed.mutate_feeds(
  customer_id: customer_id,
  operations: [operation],
)

# Prints out the Business Profile feed resource name.
business_profile_feed_resource_name = response.results.first.resource_name
puts "Business Profile feed created with resource name: #{business_profile_feed_resource_name}"

business_profile_feed_resource_name
      

Perl

# Add the feed. Since it is a system generated feed, Google Ads will automatically:
# 1. Set up the FeedAttributes on the feed.
# 2. Set up a FeedMapping that associates the FeedAttributes of the feed with the
#    placeholder fields of the LOCATION placeholder type.
my $feeds_response = $api_client->FeedService()->mutate({
    customerId => $customer_id,
    operations => [$feed_operation]});

my $feed_resource_name = $feeds_response->{results}[0]{resourceName};

printf "Business Profile feed created with resource name: '%s'.\n",
  $feed_resource_name;
      

如果 FeedMapping 尚不可用,请使用指数退避政策重试调用,直到 Feed 准备就绪。

Java

try (CustomerFeedServiceClient customerFeedServiceClient =
    googleAdsClient.getLatestVersion().createCustomerFeedServiceClient()) {

  // After the completion of the Feed ADD operation above the added feed will not be available
  // for usage in a CustomerFeed until the sync between the Google Ads and Business Profile
  // accounts
  // completes. The loop below will retry adding the CustomerFeed up to ten times with an
  // exponential back-off policy.
  String addedCustomerFeed = null;
  int numberOfAttempts = 0;
  do {
    numberOfAttempts++;
    try {
      MutateCustomerFeedsResponse customerFeedsResponse =
          customerFeedServiceClient.mutateCustomerFeeds(
              Long.toString(customerId), ImmutableList.of(customerFeedOperation));
      addedCustomerFeed = customerFeedsResponse.getResults(0).getResourceName();
      System.out.printf("Customer feed created with resource name: %s%n", addedCustomerFeed);
    } catch (GoogleAdsException gae) {
      // Waits using exponential backoff policy.
      long sleepSeconds = (long) Math.scalb(5, numberOfAttempts);

      // Exits the loop early if sleepSeconds grows too large in the event that
      // MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high.
      if (sleepSeconds > (long) Math.scalb(5, 10)) {
        break;
      }

      System.out.printf(
          "Attempt #%d to add the CustomerFeed was not successful. "
              + "Waiting %d seconds before trying again.%n",
          numberOfAttempts, sleepSeconds);
      Thread.sleep(sleepSeconds * 1000);
    }
  } while (numberOfAttempts < MAX_CUSTOMER_FEED_ADD_ATTEMPTS && addedCustomerFeed == null);
      

C#

private static void WaitForBusinessProfileFeedToBeReady(GoogleAdsClient client,
    long customerId, string businessProfileFeedResourceName)
{
    int numAttempts = 0;
    while (numAttempts < MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS)
    {
        // Once you create a feed, Google's servers will setup the feed by creating feed
        // attributes and feedmapping. Once the feedmapping is created, it is ready to be
        // used for creating customer feed.
        // This process is asynchronous, so we wait until the feed mapping is created,
        // peforming exponential backoff.
        FeedMapping feedMapping = GetBusinessProfileFeedMapping(client,
            customerId, businessProfileFeedResourceName);

        if (feedMapping == null)
        {
            numAttempts++;
            int sleepSeconds = (int)(5 * Math.Pow(2, numAttempts));
            Console.WriteLine($"Checked: #{numAttempts} time(s). Business Profile feed " +
                $"is not ready yet. Waiting {sleepSeconds} seconds before trying again.");
            Thread.Sleep(sleepSeconds * 1000);
        }
        else
        {
            Console.WriteLine($"Business Profile Feed {businessProfileFeedResourceName} " +
                $"is now ready.");
            return;
        }
    }
    throw new RpcException(new Status(StatusCode.DeadlineExceeded,
        $"Business Profile Feed is not ready after {MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS} " +
        $"retries."));
}
      

PHP

// After the completion of the feed ADD operation above the added feed will not be available
// for usage in a customer feed until the sync between the Google Ads and Business Profile
// accounts completes. The loop below will retry adding the customer feed up to ten times
// with an exponential back-off policy.
$numberOfAttempts = 0;
$addedCustomerFeed = null;
$customerFeedServiceClient = $googleAdsClient->getCustomerFeedServiceClient();
do {
    $numberOfAttempts++;
    try {
        // Issues a mutate request to add a customer feed and print its information if the
        // request succeeded.
        $addedCustomerFeed = $customerFeedServiceClient->mutateCustomerFeeds(
            $customerId,
            [$customerFeedOperation]
        );
        printf(
            "Customer feed created with resource name: '%s'.%s",
            $addedCustomerFeed->getResults()[0]->getResourceName(),
            PHP_EOL
        );
    } catch (GoogleAdsException $googleAdsException) {
        // Waits using exponential backoff policy.
        $sleepSeconds = self::POLL_FREQUENCY_SECONDS * pow(2, $numberOfAttempts);
        // Exits the loop early if $sleepSeconds grows too large in the event that
        // MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high.
        if (
            $sleepSeconds > self::POLL_FREQUENCY_SECONDS
            * pow(2, self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS)
        ) {
            break;
        }
        printf(
            "Attempt #%d to add the customer feed was not successful."
            . " Waiting %d seconds before trying again.%s",
            $numberOfAttempts,
            $sleepSeconds,
            PHP_EOL
        );
        sleep($sleepSeconds);
    }
} while (
    $numberOfAttempts < self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS
    && is_null($addedCustomerFeed)
);
      

Python

# Create a CustomerFeed operation and configure the CustomerFeed to
# associate the feed with this customer for the LOCATION placeholder
# type.

# OPTIONAL: Create a CampaignFeed to specify which FeedItems to use at
# the Campaign level.

# OPTIONAL: Create an AdGroupFeed for even more fine grained control
# over which feed items are used at the AdGroup level.
customer_feed_operation = client.get_type("CustomerFeedOperation")
customer_feed = customer_feed_operation.create
customer_feed.feed = feed_resource_name
customer_feed.placeholder_types.append(
    client.enums.PlaceholderTypeEnum.LOCATION
)
# The function string "IDENTITY(true)" will enable this feed.
true_operand = client.get_type("Operand")
true_operand.constant_operand.boolean_value = True
customer_feed.matching_function.left_operands.append(true_operand)
customer_feed.matching_function.function_string = "IDENTITY(true)"
customer_feed.matching_function.operator = (
    client.enums.MatchingFunctionOperatorEnum.IDENTITY
)

customer_feed_response = customer_feed_service.mutate_customer_feeds(
    customer_id=customer_id, operations=[customer_feed_operation]
)
print(
    "Customer feed created with resource name "
    f"'{customer_feed_response.results[0].resource_name}'."
)
      

Ruby

# After the completion of the feed ADD operation above the added feed will
# not be available for usage in a customer feed until the sync between the
# Google Ads and Business Profile accounts completes. The loop below will
# retry adding the customer feed up to ten times with an exponential back-off
# policy.
number_of_attempts = 0
added_customer_feed = nil
customer_feed_service_client = client.service.customer_feed

loop do
  number_of_attempts += 1
  begin
    # Issues a mutate request to add a customer feed and print its information
    # if the request succeeded.
    response = customer_feed_service_client.mutate_customer_feeds(
      customer_id: customer_id,
      operations: [operation]
    )
    puts "Customer feed created with resource name: " \
      "#{response.results.first.resource_name}"
  rescue Google::Ads::GoogleAds::Errors::GoogleAdsError => e
    # Waits using exponential backoff policy
    sleep_seconds = POLL_FREQUENCY_SECONDS * (2 ** number_of_attempts)
    puts "Attempt #{number_of_attempts} to add the customer feed was " \
      "not successful. Waiting #{sleep_seconds} seconds before trying again."
    sleep sleep_seconds
  end
  break if number_of_attempts >= MAX_CUSTOMER_FEED_ADD_ATTEMPTS || added_customer_feed
end
      

Perl

# After the completion of the Feed ADD operation above the added feed will not be available
# for usage in a CustomerFeed until the sync between the Google Ads and Business Profile
# accounts completes. The loop below will retry adding the CustomerFeed up to ten times with an
# exponential back-off policy.
my $customer_feed_service       = $api_client->CustomerFeedService();
my $customer_feed_resource_name = undef;
my $number_of_attempts          = 0;

while ($number_of_attempts < MAX_CUSTOMER_FEED_ADD_ATTEMPTS) {
  $number_of_attempts++;

  my $customer_feeds_response = eval {
    $customer_feed_service->mutate({
      customerId => $customer_id,
      operations => [$customer_feed_operation],
    });
  };

  if ($@) {
    # Wait using exponential backoff policy.
    my $sleep_seconds = 5 * (2**$number_of_attempts);

    # Exit the loop early if $sleep_seconds grows too large in the event that
    # MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high.
    if ($sleep_seconds > 5 * (2**10)) {
      last;
    }

    printf "Attempt #%d to add the CustomerFeed was not successful. " .
      "Waiting %d seconds before trying again.\n",
      $number_of_attempts, $sleep_seconds;

    sleep($sleep_seconds);
  } else {
    $customer_feed_resource_name =
      $customer_feeds_response->{results}[0]{resourceName};

    printf "Customer feed created with resource name: '%s'.\n",
      $customer_feed_resource_name;

    last;
  }
}
      

将 Feed 与客户相关联

Feed 准备就绪后,您可以通过创建 CustomerFeed 将其与客户相关联。然后执行 CustomerFeedService.MutateCustomerFeeds create 操作以完成关联。

应设置 CustomerFeed 的以下字段。

特性 说明
feed Feed 资源名称。 在上一步中创建的 Feed 的资源名称。
placeholder_types LOCATION 表示此 Feed 填充关联客户下的附加地址信息。
matching_function IDENTITY(true) 可将此 Feed 标记为“已启用”,而 IDENTITY(false) 可将此 Feed 标记为“已停用”。如需了解详情,请参阅过滤策略

Java

// Adds a CustomerFeed that associates the feed with this customer for
// the LOCATION placeholder type.
CustomerFeed customerFeed =
    CustomerFeed.newBuilder()
        .setFeed(businessProfileFeedResourceName)
        .addPlaceholderTypes(PlaceholderType.LOCATION)
        // Creates a matching function that will always evaluate to true.
        .setMatchingFunction(
            MatchingFunction.newBuilder()
                .addLeftOperands(
                    Operand.newBuilder()
                        .setConstantOperand(
                            ConstantOperand.newBuilder().setBooleanValue(true).build())
                        .build())
                .setFunctionString("IDENTITY(true)")
                .setOperator(MatchingFunctionOperator.IDENTITY)
                .build())
        .build();

CustomerFeedOperation customerFeedOperation =
    CustomerFeedOperation.newBuilder().setCreate(customerFeed).build();
      

C#

private static void CreateCustomerFeed(GoogleAdsClient client, long customerId,
    string businessProfileFeedResourceName)
{
    // Get the CustomerFeedService.
    CustomerFeedServiceClient customerFeedService = client.GetService(
        Services.V11.CustomerFeedService);

    // Adds a CustomerFeed that associates the feed with this customer for
    // the LOCATION placeholder type.
    CustomerFeed customerFeed = new CustomerFeed()
    {
        Feed = businessProfileFeedResourceName,
        PlaceholderTypes = { PlaceholderType.Location },
        MatchingFunction = new MatchingFunction()
        {
            LeftOperands =
            {
                new Operand()
                {
                    ConstantOperand = new ConstantOperand()
                    {
                        BooleanValue = true
                    }
                }
            },
            // Specify the function string as IDENTITY(true) to mark this feed as enabled.
            FunctionString = "IDENTITY(true)",
            Operator = MatchingFunctionOperator.Identity
        },
    };

    CustomerFeedOperation operation = new CustomerFeedOperation()
    {
        Create = customerFeed
    };

    MutateCustomerFeedsResponse customerFeedsResponse =
        customerFeedService.MutateCustomerFeeds(
            customerId.ToString(), new[] { operation });

    // Displays the result.
    string addedCustomerFeed = customerFeedsResponse.Results[0].ResourceName;
    Console.WriteLine($"Customer feed created with resource name: {addedCustomerFeed}.");
    return;
}
      

PHP

private static function createCustomerFeed(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $businessProfileFeedResourceName
) {
    // Creates a customer feed that associates the feed with this customer for the LOCATION
    // placeholder type.
    $customerFeed = new CustomerFeed([
        'feed' => $businessProfileFeedResourceName,
        'placeholder_types' => [PlaceholderType::LOCATION],
        // Creates a matching function that will always evaluate to true.
        'matching_function' => new MatchingFunction([
            'left_operands' => [new Operand([
                'constant_operand' => new ConstantOperand(['boolean_value' => true])
            ])],
            'function_string' => 'IDENTITY(true)',
            'operator' => MatchingFunctionOperator::IDENTITY
        ])
    ]);
    // Creates a customer feed operation.
    $customerFeedOperation = new CustomerFeedOperation();
    $customerFeedOperation->setCreate($customerFeed);

    // After the completion of the feed ADD operation above the added feed will not be available
    // for usage in a customer feed until the sync between the Google Ads and Business Profile
    // accounts completes. The loop below will retry adding the customer feed up to ten times
    // with an exponential back-off policy.
    $numberOfAttempts = 0;
    $addedCustomerFeed = null;
    $customerFeedServiceClient = $googleAdsClient->getCustomerFeedServiceClient();
    do {
        $numberOfAttempts++;
        try {
            // Issues a mutate request to add a customer feed and print its information if the
            // request succeeded.
            $addedCustomerFeed = $customerFeedServiceClient->mutateCustomerFeeds(
                $customerId,
                [$customerFeedOperation]
            );
            printf(
                "Customer feed created with resource name: '%s'.%s",
                $addedCustomerFeed->getResults()[0]->getResourceName(),
                PHP_EOL
            );
        } catch (GoogleAdsException $googleAdsException) {
            // Waits using exponential backoff policy.
            $sleepSeconds = self::POLL_FREQUENCY_SECONDS * pow(2, $numberOfAttempts);
            // Exits the loop early if $sleepSeconds grows too large in the event that
            // MAX_CUSTOMER_FEED_ADD_ATTEMPTS is set too high.
            if (
                $sleepSeconds > self::POLL_FREQUENCY_SECONDS
                * pow(2, self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS)
            ) {
                break;
            }
            printf(
                "Attempt #%d to add the customer feed was not successful."
                . " Waiting %d seconds before trying again.%s",
                $numberOfAttempts,
                $sleepSeconds,
                PHP_EOL
            );
            sleep($sleepSeconds);
        }
    } while (
        $numberOfAttempts < self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS
        && is_null($addedCustomerFeed)
    );

    if (is_null($addedCustomerFeed)) {
        throw new \RuntimeException(
            'Could not create the customer feed after ' . self::MAX_CUSTOMER_FEED_ADD_ATTEMPTS
            . ' attempts. Please retry the customer feed ADD operation later.'
        );
    }
}
      

Python

# After the completion of the Feed ADD operation above the added feed
# will not be available for usage in a CustomerFeed until the sync
# between the Google Ads and Business Profile accounts completes.
# This process is asynchronous, so we wait until the feed mapping is
# created, performing exponential backoff.
customer_feed_resource_name = None
number_of_attempts = 0

while number_of_attempts < MAX_CUSTOMER_FEED_ADD_ATTEMPTS:
    feed_mapping = _get_business_profile_feed_mapping(
        client, customer_id, feed_resource_name
    )

    if feed_mapping is None:
        number_of_attempts += 1
        sleep_seconds = 5 * (2**number_of_attempts)

        print(
            f"Attempt #{number_of_attempts} was not successful. "
            f"Waiting {sleep_seconds}s before trying again."
        )

        time.sleep(sleep_seconds)
    else:
        customer_feed_resource_name = feed_mapping.resource_name
        print(f"Business Profile feed {feed_resource_name} is now ready.")
        break
      

Ruby

def create_customer_feed(
  client,
  customer_id,
  business_profile_feed_resource_name)
  # Creates a customer feed operation.
  operation = client.operation.create_resource.customer_feed do |cf|
    cf.feed = business_profile_feed_resource_name
    cf.placeholder_types << :LOCATION
    cf.matching_function = client.resource.matching_function do |m|
      m.left_operands << client.resource.operand do |op|
        op.constant_operand = client.resource.constant_operand do |co|
          co.boolean_value = true
        end
      end
      m.function_string = "IDENTITY(true)"
      m.operator = :IDENTITY
    end
  end

  # After the completion of the feed ADD operation above the added feed will
  # not be available for usage in a customer feed until the sync between the
  # Google Ads and Business Profile accounts completes. The loop below will
  # retry adding the customer feed up to ten times with an exponential back-off
  # policy.
  number_of_attempts = 0
  added_customer_feed = nil
  customer_feed_service_client = client.service.customer_feed

  loop do
    number_of_attempts += 1
    begin
      # Issues a mutate request to add a customer feed and print its information
      # if the request succeeded.
      response = customer_feed_service_client.mutate_customer_feeds(
        customer_id: customer_id,
        operations: [operation]
      )
      puts "Customer feed created with resource name: " \
        "#{response.results.first.resource_name}"
    rescue Google::Ads::GoogleAds::Errors::GoogleAdsError => e
      # Waits using exponential backoff policy
      sleep_seconds = POLL_FREQUENCY_SECONDS * (2 ** number_of_attempts)
      puts "Attempt #{number_of_attempts} to add the customer feed was " \
        "not successful. Waiting #{sleep_seconds} seconds before trying again."
      sleep sleep_seconds
    end
    break if number_of_attempts >= MAX_CUSTOMER_FEED_ADD_ATTEMPTS || added_customer_feed
  end

  if added_customer_feed.nil?
    raise "Could not create the customer feed after #{MAX_CUSTOMER_FEED_ADD_ATTEMPTS} " \
      "attempts. Please retry the customer feed ADD operation later."
  end
end
      

Perl

# Add a CustomerFeed that associates the feed with this customer for the LOCATION
# placeholder type.
my $customer_feed = Google::Ads::GoogleAds::V11::Resources::CustomerFeed->new(
  {
    feed             => $feed_resource_name,
    placeholderTypes => LOCATION,
    # Create a matching function that will always evaluate to true.
    matchingFunction =>
      Google::Ads::GoogleAds::V11::Common::MatchingFunction->new({
        leftOperands => [
          Google::Ads::GoogleAds::V11::Common::Operand->new({
              constantOperand =>
                Google::Ads::GoogleAds::V11::Common::ConstantOperand->new({
                  booleanValue => "true"
                })})
        ],
        functionString => "IDENTITY(true)",
        operator       => IDENTITY
      })});