W interfejsie Google Ads API aktualizacje są przeprowadzane za pomocą maski pola. Maska pola zawiera listę wszystkich pól, które chcesz zmienić za pomocą aktualizacji. Wszystkie określone pola, które nie znajdują się w masce pola, są ignorowane, nawet jeśli zostaną wysłane na serwer.
Narzędzie FieldMasks
Zalecamy generowanie masek pól za pomocą wbudowanego narzędzia do masek pól (FieldMasks), które umożliwia generowanie masek pól
na podstawie zmodyfikowanego obiektu zamiast tworzenia ich od zera.
Oto przykład aktualizacji kampanii:
use Google::Ads::GoogleAds::Utils::FieldMasks qw(all_set_fields_of field_mask);
my $campaign =
Google::Ads::GoogleAds::V26::Resources::Campaign->new({
resourceName =>
Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
),
status => "PAUSED",
networkSettings =>
Google::Ads::GoogleAds::V26::Resources::NetworkSettings
->new({
targetSearchNetwork => "false",
}),
});
my $campaign_operation =
Google::Ads::GoogleAds::V26::Services::CampaignService::CampaignOperation
->new({
update => $campaign,
updateMask => all_set_fields_of($campaign),
});
Ten przykład najpierw tworzy obiekt Campaign, ustawiając jego nazwę zasobu
za pomocą narzędzia ResourceNames, aby interfejs API wiedział
która kampania jest aktualizowana.
Przykład używa metody FieldMasks::all_set_fields_of()
w kampanii, aby automatycznie utworzyć maskę pola, która zawiera wszystkie
ustawione pola. Następnie możesz przekazać zwróconą maskę bezpośrednio do wywołania aktualizacji.
FieldMasks::all_set_fields_of() to wygodna metoda dla
FieldMasks::field_mask(). Porównuje ona przekazany obiekt z pustym obiektem tej samej klasy. W poprzednim kodzie możesz też użyć:
field_mask(
Google::Ads::GoogleAds::V26::Resources::Campaign->new({}),
$campaign
)
zamiast all_set_fields_of($campaign).
Ręczne tworzenie maski
Aby utworzyć maskę pola od zera, najpierw utwórz obiekt
Google::Ads::GoogleAds::Common::FieldMask, a następnie
utwórz odwołanie do tablicy wypełnionej nazwami wszystkich pól, które chcesz
zmienić. Na koniec przypisz odwołanie do tablicy 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 zawiera pola podrzędne takie jak
target_cpa_micros) lub nie mieć ich wcale (np.
ManualCpm).
Pola obiektu bez zdefiniowanych pól podrzędnych
Pole obiektu w Perlu jest odpowiednikiem protobuf MESSAGE w bibliotekach klienta działających w gRPC. Podczas aktualizowania pola obiektu, które nie jest zdefiniowane z żadnymi polami podrzędnymi, użyj narzędzia FieldMasks, aby wygenerować maskę pola, jak opisano w poprzedniej sekcji.
Pola obiektu ze zdefiniowanymi polami podrzędnymi
Podczas aktualizowania pola obiektu, które jest zdefiniowane z polami podrzędnymi bez wyraźnego ustawiania żadnego z pól podrzędnych w tej wiadomości, musisz ręcznie dodać wszystkie zmienne pola podrzędne obiektu do FieldMask, podobnie jak w poprzednim przykładzie, który tworzy maskę pola od zera.
Jednym z typowych przykładów jest aktualizowanie strategii ustalania stawek w kampanii bez ustawiania żadnych pól w nowej strategii ustalania stawek. Poniższy przykład pokazuje
jak zaktualizować kampanię, aby używała strategii ustalania stawek
MaximizeConversions bez ustawiania
żadnych pól podrzędnych w strategii ustalania stawek.
W tym przypadku użycie metod all_set_fields_of() i field_mask() narzędzia FieldMasks nie przyniesie oczekiwanego rezultatu.
Poniższy przykład generuje maskę pola, która zawiera maximize_conversions. Jednak interfejs Google Ads API nie zezwala na takie działanie, aby
zapobiec przypadkowemu wyczyszczeniu pól, i generuje
FieldMaskError.FIELD_HAS_SUBFIELDS błąd.
# Creates a campaign with the proper resource name and an empty
# MaximizeConversions field.
my $campaign =
Google::Ads::GoogleAds::V26::Resources::Campaign->new({
resourceName =>
Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
),
maximizeConversions =>
Google::Ads::GoogleAds::V26::Resources::MaximizeConversions
->new(),
});
# Constructs an operation, using the FieldMasks' all_set_fields_of utility to
# derive the update mask. The field mask includes 'maximize_conversions',
# which produces a FieldMaskError.FIELD_HAS_SUBFIELDS error.
my $campaign_operation =
Google::Ads::GoogleAds::V26::Services::CampaignService::CampaignOperation
->new({
update => $campaign,
updateMask => all_set_fields_of($campaign),
});
# Sends the operation in a mutate request that results 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],
});
Poniższy przykład pokazuje, jak prawidłowo zaktualizować kampanię, aby używała strategii ustalania stawek MaximizeConversions bez ustawiania żadnych jej pól podrzędnych.
# Creates a campaign with the proper resource name.
my $campaign =
Google::Ads::GoogleAds::V26::Resources::Campaign->new({
resourceName =>
Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
),
});
# Creates a field mask from the existing campaign and adds the mutable subfield
# on the MaximizeConversions bidding strategy to the field mask. Because this
# field is included in the field mask but excluded from the campaign object,
# the Google Ads API sets 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.
#
# See the guide on assigning standard and portfolio bidding strategies
# (/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::V26::Services::CampaignService::CampaignOperation
->new({
update => $campaign,
updateMask => $field_mask,
});
Wyczyść pola
Pola można wyczyścić wyraźnie, dodając je do maski pola, jak pokazano w poprzednim przykładzie, lub ustawiając pole na pustą lub niezdefiniowaną wartość.
Załóżmy na przykład, że masz kampanię, która używa strategii ustalania stawek MaximizeConversions, a pole target_cpa_micros ma 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::V26::Resources::Campaign->new({
resourceName =>
Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
$customer_id, $campaign_id
),
maximizeConversions =>
Google::Ads::GoogleAds::V26::Resources::MaximizeConversions
->new({
targetCpaMicros => 0,
}),
});
# Constructs an operation using all_set_fields_of to derive the update mask,
# which includes 'maximize_conversions.target_cpa_micros'.
my $campaign_operation =
Google::Ads::GoogleAds::V26::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 każdego z pól podrzędnych, jak pokazano w sekcji Pola obiektu ze zdefiniowanymi polami podrzędnymi.