Para criar extensões de local do Google Ads, você precisa criar um Perfil da empresa e preenchê-lo com os endereços de todos os locais da sua empresa. Em seguida, associe o Perfil da Empresa ao seu feed de extensões de local para criar as extensões de local.
Perfil da empresa
O Perfil da empresa é o repositório central dos seus locais da empresa em todos os produtos do Google. Você não precisa se preocupar em manter os locais do Perfil da empresa e as extensões de local do Google Ads sincronizados. Basta fazer uma configuração única dos objetos de feed necessários para você. O Google Ads mantém as extensões de local sincronizadas automaticamente com os dados mais recentes do seu Perfil da empresa.
Há duas maneiras de criar locais no Perfil da Empresa.
- Você pode usar a IU do Perfil da empresa para criar seus locais. Se você seguir essa abordagem, será possível vincular os locais aos seus anúncios usando a API Google Ads.
- Você pode usar a API Business Profile para criar locais comerciais de forma programática.
Como trabalhar com a API Business Profile
Para começar a usar a API Business Profile, acesse a página inicial. Recomendamos o uso de contas empresariais em vez de contas pessoais de locais vinculados ao Google Ads. Usando uma conta empresarial, você pode compartilhar o acesso com outros usuários sem precisar compartilhar os detalhes da sua conta pessoal.
Para criar locais da empresa de forma programática usando a API Business Profile,
Comece fazendo o download de uma biblioteca de cliente. Siga o Guia de configuração básico para criar credenciais do OAuth e trabalhar com a API Business Profile.
Use a API Business Profile para listar todas as suas contas em que você tem direitos de gerenciamento. Selecione a conta para trabalhar.
Use a API Business Profile para criar os locais.
Crie um novo feed de extensões de local vinculado ao seu Perfil da Empresa
Para criar um novo feed de extensões de local, primeiro crie um objeto Feed
. Execute uma operação FeedService.MutateFeeds
create
para criar o feed. O snippet de código é mostrado abaixo.
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.V13.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::V13::Resources::Feed->new( { name => "Business Profile feed #" . uniqid(), # Configure the location feed populated from Business Profile Locations. placesLocationFeedData => Google::Ads::GoogleAds::V13::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::V13::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 });
Você precisa preencher os seguintes campos específicos para feeds de extensões de local:
Atributo | Obrigatório | Descrição |
---|---|---|
origin |
Sim | Como o feed de extensões de local é gerado pelo sistema, é necessário definir o campo origin como GOOGLE .
|
attributes |
Não | Não especifique attributes para o feed. O Google Ads criará esses atributos automaticamente, já que esse feed é gerado pelo sistema.
|
places_location_feed_data |
Sim | Definir o atributo places_location_feed_data como um objeto PlacesLocationFeedData no seu feed instrui o Google Ads a:
|
Atributos de PlacesLocationFeedData
Atributo | Obrigatório | Descrição |
---|---|---|
email_address |
Sim | O endereço de e-mail do proprietário ou de um dos gerentes do Perfil da empresa. Ele precisa corresponder ao endereço de e-mail fornecido em
oauth_info . |
oauth_info |
Sim | Informações do OAuth2 que concedem à sua conta do Google Ads acesso ao Perfil da Empresa. Se você não conhece o OAuth2, primeiro leia o guia de autenticação. |
business_account_id |
Não | O ID da conta da empresa gerenciada cujos locais serão usados.
Se você estiver usando a API Business Profile, poderá ver esse ID na parte account_id do name do Account . Caso contrário, é possível copiar a parte LOCATION_GROUP_ID da seção Informações do grupo de locais do grupo especificado.
|
business_name_filter |
Não | Nome da empresa a ser sincronizada com o Google Ads. |
category_filters |
Não | Categorias das fichas a serem sincronizadas com o Google Ads. |
label_filters |
Não | As etiquetas das fichas a serem sincronizadas com o Google Ads. |
Atributo oauth_info de PlacesLocationFeedData
Atributo | Valor | Descrição |
---|---|---|
http_method |
GET |
O método HTTP para receber informações de autorização. |
http_request_url |
https://www.googleapis.com/auth/adwords |
O escopo OAuth que a API Google Ads usa para autorizar suas solicitações para um Perfil da Empresa. |
http_authorization_header |
Bearer OAUTH_ACCESS_TOKEN |
O cabeçalho de autorização que contém o token de acesso do OAuth que concede permissão para sua conta do Google Ads fazer a leitura no Perfil da Empresa. No lugar de OAUTH_ACCESS_TOKEN ,
substitua um token de acesso gerado pelas credenciais do OAuth para o
http_request_url do
PlacesLocationFeedData
e um escopo correspondente a http_request_url . |
Aguarde o feed estar pronto
Depois que a Feed
for criada, o Google Ads criará os atributos do feed e FeedMapping
. Em seguida, ele preencherá o conteúdo do feed criando os objetos FeedItem
que correspondem aos locais no Perfil da empresa.
É necessário aguardar até que o FeedMapping
seja
criado para garantir que o feed seja configurado corretamente e que possa ser usado nas
próximas etapas. Isso pode ser feito tentando recuperar o FeedMapping
para o feed relevante com placeholder_type
igual a LOCATION
.
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.V13.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;
Se FeedMapping
ainda não estiver disponível, tente
chamar novamente com uma política de espera exponencial até que
Feed
esteja pronto.
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; } }
Associe o feed ao cliente
Quando o feed estiver pronto, você poderá associá-lo a um cliente criando um CustomerFeed
. Em seguida, execute uma operação
CustomerFeedService.MutateCustomerFeeds
create
para concluir a vinculação.
Os campos a seguir do CustomerFeed
precisam ser definidos.
Atributo | Valor | Descrição |
---|---|---|
feed |
O nome do recurso do feed. | O nome do recurso do feed que foi criado na etapa anterior. |
placeholder_types |
LOCATION |
Indica que esse feed preenche as extensões de local no cliente conectado. |
matching_function |
IDENTITY(true) para marcar o feed como ativado e IDENTITY(false) para marcá-lo como desativado. Consulte Estratégias de filtragem para mais detalhes.
|
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.V13.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::V13::Resources::CustomerFeed->new( { feed => $feed_resource_name, placeholderTypes => LOCATION, # Create a matching function that will always evaluate to true. matchingFunction => Google::Ads::GoogleAds::V13::Common::MatchingFunction->new({ leftOperands => [ Google::Ads::GoogleAds::V13::Common::Operand->new({ constantOperand => Google::Ads::GoogleAds::V13::Common::ConstantOperand->new({ booleanValue => "true" })}) ], functionString => "IDENTITY(true)", operator => IDENTITY })});