W interfejsie Google Ads API aktualizacje są przeprowadzane za pomocą maski pola. Maska pola zawiera listę wszystkich pól, które chcesz zmienić podczas aktualizacji. Wszystkie pola, które nie znajdują się w masce, są ignorowane, nawet jeśli zostaną wysłane na serwer.
Narzędzie FieldMasks
Zalecane jest generowanie masek pól za pomocą wbudowanej funkcji maski pola (FieldMasks
), która umożliwia generowanie masek pól na podstawie zmodyfikowanego obiektu zamiast tworzenia ich od podstaw.
Oto przykład aktualizacji kampanii:
my $campaign = Google::Ads::GoogleAds::V20::Resources::Campaign->new({
resourceName =>
Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
),
status => PAUSED,
networkSettings =>
Google::Ads::GoogleAds::V20::Resources::NetworkSettings->new({
targetSearchNetwork => "false"
})
});
my $campaign_operation =
Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
update => $campaign,
updateMask => all_set_fields_of($campaign)
});
W tym przykładzie najpierw tworzymy obiekt Campaign
, ustawiając jego nazwę zasobu za pomocą narzędzia ResourceNames
, aby interfejs API wiedział, która kampania jest aktualizowana.
Przykład wykorzystuje metodę FieldMasks::all_set_fields_of()
w kampanii, aby automatycznie wygenerować maskę pola, która wylicza wszystkie pola zestawu. Następnie możesz przekazać zwróconą maskę bezpośrednio do wywołania update.
FieldMasks::all_set_fields_of()
to wygodna metoda dla FieldMasks::field_mask()
.
Porównuje przekazany obiekt z pustym obiektem tej samej klasy. W kodzie powyżej możesz też użyć
field_mask(Google::Ads::GoogleAds::V20::Resources::Campaign->new({}), $campaign)
zamiast all_set_fields_of($campaign)
.
Ręczne tworzenie maski
Aby utworzyć maskę pola od podstaw, musisz najpierw utworzyć obiekt Google::Ads::GoogleAds::Common::FieldMask
, a potem utworzyć odwołanie do tablicy wypełnione nazwami wszystkich pól, które chcesz zmienić. Następnie musisz przypisać to odwołanie do pola paths
maski pola.
my $field_mask = Google::Ads::GoogleAds::Common::FieldMask->new({
paths => ["status", "name"]
});
Aktualizowanie pól obiektu i ich pól podrzędnych
Pola obiektu mogą mieć pola podrzędne (np. MaximizeConversions
, które ma 3 pola: target_cpa_micros
, cpc_bid_ceiling_micros
i cpc_bid_floor_micros
), lub nie mieć ich wcale (np. ManualCpm
).
pola obiektu bez zdefiniowanych pól podrzędnych.
Pole obiektu w Perlu jest równoważne z protobufem MESSAGE
w bibliotekach klienta działających w ramach gRPC. Podczas aktualizowania pola obiektu, które nie jest zdefiniowane za pomocą żadnych pól podrzędnych, użyj narzędzia FieldMasks, aby wygenerować maskę pola, jak opisano powyżej.
Pola obiektu z zdefiniowanymi podpolami
Podczas aktualizowania pola obiektu zdefiniowanego za pomocą podpól bez jawnego ustawiania podpól w tym komunikacie musisz ręcznie dodać wszystkie zmiennie podpola obiektu do FieldMask
, podobnie jak w przykładzie powyżej, który tworzy maskę pola od podstaw.
Typowym przykładem jest aktualizacja strategii ustalania stawek w kampanii bez ustawiania żadnych pól w nowej strategii ustalania stawek. Przykład poniżej pokazuje, jak zaktualizować kampanię, aby używała strategii ustalania stawek MaximizeConversions
bez ustawiania żadnych podpól strategii ustalania stawek.
W tym przypadku użycie metod all_set_fields_of()
i field_mask()
w narzędziu FieldMasks nie przynosi zamierzonego efektu.
W tym przykładzie maska pola zawiera maximize_conversions
. Interfejs Google Ads API nie zezwala jednak na takie działanie, aby zapobiec przypadkowemu oczyszczeniu pól i wystąpieniu błęduFieldMaskError.FIELD_HAS_SUBFIELDS
.
# Creates a campaign with the proper resource name and an empty
# MaximizeConversions field.
my $campaign = Google::Ads::GoogleAds::V20::Resources::Campaign->new({
resourceName =>
Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
),
maximizeConversions =>
Google::Ads::GoogleAds::V20::Resources::MaximizeConversions->new()
});
# Constructs an operation, using the FieldMasks' all_set_fields_of utility to
# derive the update mask. The field mask will include 'maximize_conversions',
# which will produce a FieldMaskError.FIELD_HAS_SUBFIELDS error.
my $campaign_operation =
Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
update => $campaign,
updateMask => all_set_fields_of($campaign)
});
# Sends the operation in a mutate request that will result in a
# FieldMaskError.FIELD_HAS_SUBFIELDS error because empty object fields cannot
# be included in a field mask.
my $response = $api_client->CampaignService()->mutate({
customerId => $customer_id,
operations => [$campaign_operation]
});
Z poniższego przykładu dowiesz się, jak prawidłowo zaktualizować kampanię, aby używała strategii ustalania stawek MaximizeConversions
bez ustawiania żadnych jej podpól.
# Creates a campaign with the proper resource name.
my $campaign = Google::Ads::GoogleAds::V20::Resources::Campaign->new({
resourceName => Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
)
});
# Creates a field mask from the existing campaign and adds all of the fields
# on the MaximizeConversions bidding strategy to the field mask. Because these
# fields are included in the field mask but excluded from the campaign object,
# the Google Ads API will set the campaign's bidding strategy to a
# MaximizeConversions object with none of its subfields set.
# Only include 'maximize_conversions.target_cpa_micros' in the field mask
# as it is the only mutable subfield on MaximizeConversions when used as a
# standard bidding strategy.
#
# Learn more about standard and portfolio bidding strategies here:
# https://developers.google.com/google-ads/api/docs/campaigns/bidding/assign-strategies
my $field_mask = all_set_fields_of($campaign);
push @{$field_mask->{paths}}, "maximize_conversions.target_cpa_micros";
# Creates an operation to update the campaign with the specified fields.
my $campaign_operation =
Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
update => $campaign,
updateMask => $field_mask
});
Czyszczenie pól
Pola można wyczyścić, dodając je do maski pola w sposób pokazany powyżej, lub ustawiając w nich pustą lub niezdefiniowaną wartość. Załóżmy na przykład, że masz kampanię, która korzysta ze strategii ustalania stawek MaximizeConversions
, a pole target_cpa_micros
ma ustawioną wartość większą niż 0
.
# Creates a campaign with the proper resource name and a MaximizeConversions
# object with target_cpa_micros set to 0.
my $campaign =
Google::Ads::GoogleAds::V20::Resources::Campaign->new({
resourceName => Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
),
maximizeConversions => Google::Ads::GoogleAds::V20::Resources::MaximizeConversions->new({
targetCpaMicros => 0
})
});
# Constructs an operation, using the FieldMasks' all_set_fields_of utility to
# derive the update mask, which will include 'maximize_conversions.target_cpa_micros'.
my $campaign_operation =
Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
update => $campaign,
updateMask => all_set_fields_of($campaign)
});
Pamiętaj, że pola z zagnieżdżonymi polami podrzędnymi można wyczyścić tylko przez wyczyszczenie poszczególnych pól podrzędnych, jak pokazano w sekcji Pola obiektu z określonymi polami podrzędnymi.