Assume you have a flight reservation site where you've set up Dynamic
Remarketing ads, and you want to update the sale price on some flights and
remove the sale price on others. To ensure that your ads display the correct
prices for each flight, you'll want to update the price on each flight's
corresponding FeedItem
.
Updating the price of a flight
This is similar to creating new FeedItem
objects. However, to update the
FeedItemAttributeValue
of flight price, you
must update the FeedItem
with the new FeedItemAttributeValue
. In order to do
so, you must retrieve the feed_attribute_id
using the
FlightPlaceholderField
, so that you can indicate which
FeedAttribute
. It's also important to note that you
must include all of the other existing FeedItemAttributeValue
objects that you
don't want to change in the FeedItem
. If you fail to do so, they will be
removed from the FeedItem
. Full list of FlightPlaceholderField
values.
The basic steps to modify each flight entry are:
- Get the mapping from placeholder to feed attribute ID using the utility method.
- Use the mapping and placeholder field to get the ID of the
FeedItemAttributeValue
. - Get the
FeedItem
containing theFeedItemAttributeValue
that will be updated. - Create a
FeedItemAttributeValue
using thefeed_attribute_id
obtained previously and the updated value of theFeedItemAttributeValue
. - Construct a new
FeedItem
from the existingFeedItem
. AnyFeedItemAttributeValues
that are not included in the updatedFeedItem
will be removed from theFeedItem
, which is why you must create theFeedItem
from the existingFeedItem
and set the fields that are to be updated. - Create a new
FeedItemOperation
as anupdate
operation with anupdate_mask
of the set fields of the newly createdFeedItem
.
Java
private void updateFeedItem( GoogleAdsClient googleAdsClient, long customerId, long feedId, long feedItemId, String flightPlaceholderField, String attributeValue) { // Gets the feed resource name. String feedResourceName = ResourceNames.feed(customerId, feedId); // Gets a map of the placeholder values and feed attributes. Map<FlightPlaceholderField, FeedAttribute> feedAttributes = AddFlightsFeed.getFeed(googleAdsClient, customerId, feedResourceName); // Gets the ID of the attribute to update. This is needed to specify which // FeedItemAttributeValue will be updated in the given FeedItem. long attributeId = feedAttributes .get(FlightPlaceholderField.valueOf(flightPlaceholderField.toUpperCase())) .getId(); // Gets the feed item resource name. String feedItemResourceName = ResourceNames.feedItem(customerId, feedId, feedItemId); // Retrieves the feed item and its associated attributes based on its resource name. FeedItem feedItem = getFeedItem(googleAdsClient, customerId, feedItemResourceName); // Creates the updated FeedItemAttributeValue. FeedItemAttributeValue feedItemAttributeValue = FeedItemAttributeValue.newBuilder() .setFeedAttributeId(attributeId) .setStringValue(attributeValue) .build(); // Creates a new FeedItem from the existing FeedItem. Any FeedItemAttributeValues that are // not included in the updated FeedItem will be removed from the FeedItem, which is why you // must create the FeedItem from the existing FeedItem and set the field(s) that will be // updated. feedItem = feedItem.toBuilder() // Sets the attribute value of the FeedItem given its index relative to other attributes // in the FeedItem. .setAttributeValues( // Gets the index of the attribute value that will be updated. getAttributeIndex(feedItem, feedItemAttributeValue), feedItemAttributeValue) .build(); // Creates the operation. FeedItemOperation operation = FeedItemOperation.newBuilder() .setUpdate(feedItem) .setUpdateMask(FieldMasks.allSetFieldsOf(feedItem)) .build(); // Creates the feed item service client. try (FeedItemServiceClient feedItemServiceClient = googleAdsClient.getLatestVersion().createFeedItemServiceClient()) { // Updates the feed item. MutateFeedItemsResponse response = feedItemServiceClient.mutateFeedItems( Long.toString(customerId), ImmutableList.of(operation)); for (MutateFeedItemResult result : response.getResultsList()) { System.out.printf("Updated feed item with resource name '%s'.%n", result.getResourceName()); } } }
C#
private void UpdateFeedItem(GoogleAdsClient client, long customerId, long feedId, long feedItemId, string flightPlaceholderFieldName, string attributeValue) { // Get the FeedItemServiceClient. FeedItemServiceClient feedItemService = client.GetService(Services.V15.FeedItemService); // Gets the feed resource name. string feedResourceName = ResourceNames.Feed(customerId, feedId); // Gets a map of the placeholder values and feed attributes. Dictionary<FlightPlaceholderField, FeedAttribute> feedAttributes = GetFeed(client, customerId, feedResourceName); // Gets the ID of the attribute to update. This is needed to specify which // FeedItemAttributeValue will be updated in the given FeedItem. FlightPlaceholderField placeholderField = (FlightPlaceholderField) Enum.Parse( typeof(FlightPlaceholderField), flightPlaceholderFieldName); long attributeId = feedAttributes[placeholderField].Id; // Gets the feed item resource name. string feedItemResourceName = ResourceNames.FeedItem(customerId, feedId, feedItemId); // Retrieves the feed item and its associated attributes based on its resource name. FeedItem feedItem = GetFeedItem(client, customerId, feedItemResourceName); // Creates the updated FeedItemAttributeValue. FeedItemAttributeValue feedItemAttributeValue = new FeedItemAttributeValue() { FeedAttributeId = attributeId, StringValue = attributeValue }; // Creates a new FeedItem from the existing FeedItem. Any FeedItemAttributeValues that // are not included in the updated FeedItem will be removed from the FeedItem, which is // why you must create the FeedItem from the existing FeedItem and set the field(s) // that will be updated. int attributeIndex = feedItem.AttributeValues .Select((item, index) => new { item, index }) .Where(itemIndexPair => itemIndexPair.item.FeedAttributeId == feedItemAttributeValue.FeedAttributeId) .Select(itemIndexPair => itemIndexPair.index + 1) .FirstOrDefault() - 1; if (attributeIndex == -1) { throw new ArgumentException("No matching feed attribute found for " + $"value '{feedItemAttributeValue}'."); } feedItem.AttributeValues[attributeIndex] = feedItemAttributeValue; // Creates the operation. FeedItemOperation operation = new FeedItemOperation() { Update = feedItem, UpdateMask = FieldMasks.AllSetFieldsOf(feedItem) }; // Updates the feed item. MutateFeedItemsResponse response = feedItemService.MutateFeedItems(customerId.ToString(), new[] { operation }); foreach (MutateFeedItemResult result in response.Results) { Console.WriteLine($"Updated feed item with resource name " + $"'{result.ResourceName}'."); } } /// <summary> /// Retrieves details about a feed. The initial query retrieves the FeedAttributes, or /// columns, of the feed. Each FeedAttribute will also include the FeedAttributeId, which /// will be used in a subsequent step. The example then inserts a new key, value pair into /// a map for each FeedAttribute, which is the return value of the method. The keys are the /// placeholder types that the columns will be. The values are the FeedAttributes. /// </summary> /// <param name="client">The Google Ads client.</param> /// <param name="customerId"> /// The Google Ads customer ID for which the flights feed is added. /// </param> /// <param name="feedResourceName">The resource name of the feed.</param> /// <returns>A Map containing the FlightPlaceholderField and FeedAttribute.</returns> public Dictionary<FlightPlaceholderField, FeedAttribute> GetFeed( GoogleAdsClient client, long customerId, string feedResourceName) { // Get the GoogleAdsService. GoogleAdsServiceClient googleAdsService = client.GetService( Services.V15.GoogleAdsService); // Constructs the query. string query = "SELECT feed.attributes FROM feed WHERE feed.resource_name = " + $"'{feedResourceName}'"; // Constructs the request. SearchGoogleAdsRequest request = new SearchGoogleAdsRequest() { CustomerId = customerId.ToString(), Query = query }; // Issues the search request and get the first result, since we only need the single // feed item we created previously.. GoogleAdsRow googleAdsRow = googleAdsService.Search(request).First(); // Gets the attributes list from the feed and creates a map with keys of each attribute // and values of each corresponding ID. Dictionary<FlightPlaceholderField, FeedAttribute> feedAttributes = new Dictionary<FlightPlaceholderField, FeedAttribute>(); // Loops through the feed attributes to populate the map. foreach (FeedAttribute feedAttribute in googleAdsRow.Feed.Attributes) { switch (feedAttribute.Name) { case "Flight Description": feedAttributes[FlightPlaceholderField.FlightDescription] = feedAttribute; break; case "Destination ID": feedAttributes[FlightPlaceholderField.DestinationId] = feedAttribute; break; case "Flight Price": feedAttributes[FlightPlaceholderField.FlightPrice] = feedAttribute; break; case "Flight Sale Price": feedAttributes[FlightPlaceholderField.FlightSalePrice] = feedAttribute; break; case "Final URLs": feedAttributes[FlightPlaceholderField.FinalUrls] = feedAttribute; break; // The full list of FlightPlaceholderFields can be found here // https://developers.google.com/google-ads/api/reference/rpc/latest/FlightPlaceholderFieldEnum.FlightPlaceholderField default: throw new Exception("Invalid attribute name."); } } return feedAttributes; } /// <summary> /// Retrieves a feed item and its attribute values given a resource name. /// </summary> /// <param name="client">The Google Ads client.</param> /// <param name="customerId"> /// The Google Ads customer ID for which the flights feed is added. /// </param> /// <param name="feedItemResourceName">Feed item resource name.</param> /// <returns>FeedItem with the given resource name.</returns> private FeedItem GetFeedItem(GoogleAdsClient client, long customerId, string feedItemResourceName) { // Get the GoogleAdsService. GoogleAdsServiceClient googleAdsService = client.GetService( Services.V15.GoogleAdsService); // Constructs the query. string query = "SELECT feed_item.attribute_values FROM feed_item WHERE " + $"feed_item.resource_name = '{feedItemResourceName}'"; // Constructs the request. SearchGoogleAdsRequest request = new SearchGoogleAdsRequest() { CustomerId = customerId.ToString(), Query = query }; return googleAdsService.Search(request).First().FeedItem; }
PHP
public static function runExample( GoogleAdsClient $googleAdsClient, int $customerId, int $feedId, int $feedItemId, string $flightPlaceholderFieldName, string $attributeValue ) { // Gets a map of the placeholder values to feed attributes. $placeHoldersToFeedAttributesMap = Feeds::flightPlaceholderFieldsMapFor( ResourceNames::forFeed($customerId, $feedId), $customerId, $googleAdsClient ); // Gets the ID of the feed attribute for the placeholder field. This is needed to specify // which feed item attribute value will be updated in the given feed item. $attributeId = $placeHoldersToFeedAttributesMap[ FlightPlaceholderField::value($flightPlaceholderFieldName)]->getId(); // Creates the updated feed item attribute value. $updatedFeedItemAttributeValue = new FeedItemAttributeValue([ 'feed_attribute_id' => $attributeId, 'string_value' => $attributeValue ]); // Retrieves the feed item and its associated attributes based on the resource name. $feedItem = Feeds::feedItemFor( ResourceNames::forFeedItem($customerId, $feedId, $feedItemId), $customerId, $googleAdsClient ); // Gets the index of the attribute value that will be updated in the feed item. $attributeIndex = Feeds::attributeIndexFor($updatedFeedItemAttributeValue, $feedItem); // Any feed item attribute values that are not included in the updated feed item will be // removed from the feed item, which is why you must create the feed item from the existing // feed item and its attribute values. Then, update only the attribute that you want. $feedItemAttributeValues = $feedItem->getAttributeValues(); $feedItemAttributeValues[$attributeIndex] = $updatedFeedItemAttributeValue; $feedItem->setAttributeValues($feedItemAttributeValues); // Creates the feed item operation. $operation = new FeedItemOperation(); $operation->setUpdate($feedItem); $operation->setUpdateMask(FieldMasks::allSetFieldsOf($feedItem)); // Issues a mutate request to update the feed item and print some information. $feedItemServiceClient = $googleAdsClient->getFeedItemServiceClient(); $response = $feedItemServiceClient->mutateFeedItems( MutateFeedItemsRequest::build($customerId, [$operation]) ); printf( "Feed item with resource name '%s' was updated.%s", $response->getResults()[0]->getResourceName(), PHP_EOL ); }
Python
def main( client, customer_id, feed_id, feed_item_id, flight_placeholder_field_name, attribute_value, ): """The main method that creates all necessary entities for the example. Args: client: an initialized GoogleAdsClient instance customer_id: a client customer ID feed_id: the ID of feed containing the feed item to be updated feed_item_id: The ID of the feed item to be updated flight_placeholder_field_name: the flight placeholder field name for the attribute to be updated attribute_value: the new value to set the feed attribute to """ feed_service = client.get_service("FeedService") # Gets a map of the placeholder values to feed attributes. placeholders_to_feed_attribute_map = flight_placeholder_fields_map( client, customer_id, feed_service.feed_path(customer_id, feed_id) ) # Gets the ID of the feed attribute for the placeholder field. This is # needed to specify which feed item attribute value will be updated in # the given feed item. flight_placeholder_field_enum = client.enums.FlightPlaceholderFieldEnum flight_placeholder_enum_value = getattr( flight_placeholder_field_enum, flight_placeholder_field_name ) attribute_id = placeholders_to_feed_attribute_map[ flight_placeholder_enum_value ].id # Creates the updated feed item attribute value. updated_feed_item_attribute_value = client.get_type( "FeedItemAttributeValue" ) updated_feed_item_attribute_value.feed_attribute_id = attribute_id updated_feed_item_attribute_value.string_value = attribute_value # Retrieves the feed item and its associated attributes based on the # resource name. feed_item_service = client.get_service("FeedItemService") feed_item = get_feed_item( client, customer_id, feed_item_service.feed_item_path(customer_id, feed_id, feed_item_id), ) # Gets the index of the attribute value that will be updated in the # feed item. attribute_index = get_attribute_index( updated_feed_item_attribute_value, feed_item ) # Any feed item attribute values that are not included in the updated # feed item will be removed from the feed item, which is why you must # create the feed item from the existing feed item and its attribute # values. Then, update only the attribute that you want. feed_item_operation = client.get_type("FeedItemOperation") client.copy_from(feed_item_operation.update, feed_item) updated_feed_item = feed_item_operation.update client.copy_from( updated_feed_item.attribute_values[attribute_index], updated_feed_item_attribute_value, ) # Create a field mask using the old feed_item and the updated_feed_item. client.copy_from( feed_item_operation.update_mask, protobuf_helpers.field_mask(feed_item._pb, updated_feed_item._pb), ) response = feed_item_service.mutate_feed_items( customer_id=customer_id, operations=[feed_item_operation] ) print( "Feed item with resource name: " f"'{response.results[0].resource_name}' was updated." )
Ruby
def update_flights_feed_item_string_attribute_value( customer_id, feed_id, feed_item_id, flight_placeholder_field_name, attribute_value) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new # Gets a map of the placeholder values to feed attributes. placeholders_to_feed_attributes_map = flight_placeholder_fields_map_for( client, customer_id, client.path.feed(customer_id, feed_id), ) # Gets the ID of the feed attribute for the placeholder field. This is # needed to specify which feed item attribute value will be updated in the # given feed item. attribute_id = placeholders_to_feed_attributes_map[ flight_placeholder_field_name.to_sym].id # Retrieves the feed item and its associated attributes based on the resource # name. feed_item_resource_name = client.path.feed_item(customer_id, feed_id, feed_item_id) feed_item = feed_item_for( client, customer_id, feed_item_resource_name, ) # Creates the updated feed item attribute value. updated_feed_item_attribute_value = client.resource.feed_item_attribute_value do |v| v.feed_attribute_id = attribute_id v.string_value = attribute_value end # Gets the index of the attribute value that will be updated in the feed item. attribute_index = attribute_index_for( updated_feed_item_attribute_value, feed_item, ) # Any feed item attribute values that are not included in the feed item will # be removed, which is why you must retain all other feed attribute values # here. feed_item_attribute_values = feed_item.attribute_values puts feed_item_attribute_values feed_item_attribute_values[attribute_index] = client.resource.feed_item_attribute_value do |v| v.feed_attribute_id = attribute_id v.string_value = attribute_value end # Creates the feed item operation. operation = client.operation.update_resource.feed_item(feed_item_resource_name) do |item| item.attribute_values.replace(feed_item_attribute_values.to_a) end # Issues a mutate request to update the feed item and print some information. response = client.service.feed_item.mutate_feed_items( customer_id: customer_id, operations: [operation], ) puts "Feed item with resource name " \ "'#{response.results.first.resource_name}' was updated." end
Perl
sub update_flights_feed_item_string_attribute_value { my ($api_client, $customer_id, $feed_id, $feed_item_id, $flight_placeholder_field_name, $attribute_value) = @_; # Get the feed resource name. my $feed_resource_name = Google::Ads::GoogleAds::V15::Utils::ResourceNames::feed($customer_id, $feed_id); # Get a hash of the placeholder values and feed attributes. my $feed_attributes = get_feed($api_client, $customer_id, $feed_resource_name); # Get the ID of the attribute to update. This is needed to specify which # FeedItemAttributeValue will be updated in the given FeedItem. my $attribute_id = $feed_attributes->{uc($flight_placeholder_field_name)}{id}; # Get the feed item resource name. my $feed_item_resource_name = Google::Ads::GoogleAds::V15::Utils::ResourceNames::feed_item($customer_id, $feed_id, $feed_item_id); # Retrieve the feed item and its associated attributes based on its resource name. my $feed_item = get_feed_item($api_client, $customer_id, $feed_item_resource_name); # Create the updated FeedItemAttributeValue. my $feed_item_attribute_value = Google::Ads::GoogleAds::V15::Resources::FeedItemAttributeValue->new({ feedAttributeId => $attribute_id, stringValue => $attribute_value }); # Get the index of the attribute value that will be updated. my $attribute_index = get_attribute_index($feed_item, $attribute_id); # Set the attribute value of the FeedItem given its index relative to other attributes # in the FeedItem. $feed_item->{attributeValues}[$attribute_index] = $feed_item_attribute_value; # Create a feed item operation. my $feed_item_operation = Google::Ads::GoogleAds::V15::Services::FeedItemService::FeedItemOperation-> new({ update => $feed_item, updateMask => all_set_fields_of($feed_item)}); # Update the feed item. my $feed_items_response = $api_client->FeedItemService()->mutate({ customerId => $customer_id, operations => [$feed_item_operation]}); printf "Updated feed item with resource name: '%s'.\n", $feed_items_response->{results}[0]{resourceName}; return 1; }
Removing the sale price of a flight
Removing a FeedItemAttributeValue
from a FeedItem
requires basically the
same steps as updating a FeedItemAttributeValue
because, in either case, you
must perform an update FeedItemOperation
to update the FeedItem
. The only
difference is that instead of updating the FeedItemAttributeValue
from the
FeedItem
, you remove it.
The basic steps to remove an FeedItemAttributeValue
from a FeedItem
are:
- Get the ID of the attribute you want to remove.
- Retrieve the
FeedItem
you will be updating. - Create a new
FeedItemAttributeValue
with the attribute ID you retrieved earlier. You don't have to set the value for theFeedItemAttributeValue
because theFeedItemAttributeValue
will be removed. - Get the index of the attribute that will be removed.
- Remove the attribute value from the
FeedItem
and perform the update operation on theFeedItem
in the same way you would if you were updating the attribute value.
Java
private FeedItem removeAttributeValueFromFeedItem( GoogleAdsClient googleAdsClient, long customerId, Map<FlightPlaceholderField, FeedAttribute> feedAttributes, String feedItemResourceName, FlightPlaceholderField flightPlaceholderField) { // Gets the ID of the FeedAttribute for the placeholder field and converts to an integer. long attributeId = feedAttributes.get(flightPlaceholderField).getId(); // Retrieves the feed item and its associated attributes based on its resource name. FeedItem feedItem = getFeedItem(googleAdsClient, customerId, feedItemResourceName); // Creates the FeedItemAttributeValue that will be updated. FeedItemAttributeValue feedItemAttributeValue = FeedItemAttributeValue.newBuilder().setFeedAttributeId(attributeId).build(); // Gets the index of the attribute value that will be removed. int attributeIndex = getAttributeIndex(feedItem, feedItemAttributeValue); // Returns the feed item with the removed FeedItemAttributeValue. Any FeedItemAttributeValues // that are not included in the updated FeedItem will be removed from the FeedItem, which is // why you must create the FeedItem from the existing FeedItem and set the field(s) that will // be removed. return feedItem.toBuilder().removeAttributeValues(attributeIndex).build(); }
C#
private FeedItem RemoveAttributeValueFromFeedItem(GoogleAdsClient client, long customerId, long feedId, long feedItemId, Dictionary<FlightPlaceholderField, FeedAttribute> placeholdersToFeedAttributesMap, FlightPlaceholderField flightPlaceholderFieldName) { // Gets the ID of the FeedAttribute for the placeholder field. long attributeId = placeholdersToFeedAttributesMap[flightPlaceholderFieldName].Id; // Retrieves the feed item and its associated attributes based on its resource name. FeedItem feedItem = GetFeedItem(client, customerId, feedId, feedItemId); //Creates the FeedItemAttributeValue that will be updated. FeedItemAttributeValue feedItemAttributeValue = new FeedItemAttributeValue { FeedAttributeId = attributeId }; // Gets the index of the attribute value that will be removed. int attributeIndex = feedItem.AttributeValues .Select((item, index) => new { item, index }) .Where(itemIndexPair => itemIndexPair.item.FeedAttributeId == feedItemAttributeValue.FeedAttributeId) .Select(itemIndexPair => itemIndexPair.index + 1) .FirstOrDefault() - 1; if (attributeIndex == -1) { throw new ArgumentException("No matching feed attribute found for " + $"value '{feedItemAttributeValue}'."); } // Returns the feed item with the removed FeedItemAttributeValue. Any // FeedItemAttributeValues that are not included in the updated FeedItem will be // removed from the FeedItem, which is why you must create the FeedItem from the // existing FeedItem and set the field(s) that will be removed. feedItem.AttributeValues.RemoveAt(attributeIndex); return feedItem; }
PHP
// Gets a map of the placeholder values to feed attributes. $placeHoldersToFeedAttributesMap = Feeds::flightPlaceholderFieldsMapFor( ResourceNames::forFeed($customerId, $feedId), $customerId, $googleAdsClient ); // Gets the ID of the feed attribute for the placeholder field. $attributeId = $placeHoldersToFeedAttributesMap[ FlightPlaceholderField::value($flightPlaceholderFieldName)]->getId(); // Creates the feed item attribute value that will be removed, so only the feed attribute ID // is needed. $removedFeedItemAttributeValue = new FeedItemAttributeValue([ 'feed_attribute_id' => $attributeId ]); // Retrieves the feed item and its associated attributes based on the resource name. $feedItem = Feeds::feedItemFor( ResourceNames::forFeedItem($customerId, $feedId, $feedItemId), $customerId, $googleAdsClient ); // Gets the index of the attribute value that will be removed in the feed item. $attributeIndex = Feeds::attributeIndexFor($removedFeedItemAttributeValue, $feedItem); // Any feed item attribute values that are not included in the feed item will be removed, // which is why you must retain all other feed attribute values here. $feedItemAttributeValues = array_filter( iterator_to_array($feedItem->getAttributeValues()->getIterator()), function ($index) use ($attributeIndex) { return $index !== $attributeIndex; }, ARRAY_FILTER_USE_KEY ); $feedItem->setAttributeValues($feedItemAttributeValues);
Python
# Get the FeedItemService client. feed_item_service = client.get_service("FeedItemService") # Create the FeedItemOperation. feed_item_operation = client.get_type("FeedItemOperation") # Get a map of the FlightPlaceholderFields to FeedAttributes. placeholders_to_feed_attributes_map = get_feed(client, customer_id, feed_id) # Remove the attribute from the feed item. flight_placeholder_field = client.enums.FlightPlaceholderFieldEnum[ flight_placeholder_field_name ].value feed_item = remove_attribute_value_from_feed_item( client, customer_id, feed_id, feed_item_id, placeholders_to_feed_attributes_map, flight_placeholder_field, ) client.copy_from(feed_item_operation.update, feed_item) # Configure the operation. client.copy_from( feed_item_operation.update_mask, protobuf_helpers.field_mask(None, feed_item._pb), ) # Update the feed item and print the results. response = feed_item_service.mutate_feed_items( customer_id=customer_id, operations=[feed_item_operation] )
Ruby
# Gets a map of the placeholder values to feed attributes. placeholders_to_feed_attributes_map = flight_placeholder_fields_map_for( client, customer_id, client.path.feed(customer_id, feed_id), ) # Gets the ID of the feed attribute for the placeholder field. attribute_id = placeholders_to_feed_attributes_map[ flight_placeholder_field_name.to_sym].id # Creates the feed item attribute value that will be removed, so only the # feed attribute ID is needed. remove_feed_item_attribute_value = client.resource.feed_item_attribute_value do |v| v.feed_attribute_id = attribute_id end # Retrieves the feed item and its associated attributes based on the resource # name. feed_item_resource_name = client.path.feed_item(customer_id, feed_id, feed_item_id) feed_item = feed_item_for( client, customer_id, feed_item_resource_name, ) # Gets the index of the attribute value that will be removed in the feed item. attribute_index = attribute_index_for( remove_feed_item_attribute_value, feed_item, ) # Any feed item attribute values that are not included in the feed item will # be removed, which is why you must retain all other feed attribute values # here. feed_item_attribute_values = feed_item.attribute_values.select.with_index { |item, idx| idx != attribute_index }
Perl
# Get the feed resource name. my $feed_resource_name = Google::Ads::GoogleAds::V15::Utils::ResourceNames::feed($customer_id, $feed_id); # Get a hash of the placeholder values and feed attributes. my $feed_attributes = get_feed($api_client, $customer_id, $feed_resource_name); # Get the feed item resource name. my $feed_item_resource_name = Google::Ads::GoogleAds::V15::Utils::ResourceNames::feed_item($customer_id, $feed_id, $feed_item_id); # Remove the attribute from the feed item. my $feed_item = remove_attribute_value_from_feed_item($api_client, $customer_id, $feed_attributes, $feed_item_resource_name, uc($flight_placeholder_field_name));