В Google Ads API обновления выполняются с помощью маски поля. Маска поля содержит список всех полей, которые вы хотите изменить, и все указанные поля, которых нет в маске, игнорируются, даже если они отправлены на сервер.
Утилита FieldMasks
Рекомендуем создавать маски полей с помощью встроенной утилиты FieldMasks. Она позволяет генерировать маски полей на основе измененного объекта, а не создавать их с нуля.
Ниже приведен пример обновления кампании.
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),
});
В этом примере сначала создается объект Campaign, для которого задается название ресурса с помощью утилиты ResourceNames, чтобы API знал, какая кампания обновляется.
В примере используется метод FieldMasks::all_set_fields_of()
для кампании, чтобы автоматически создать маску поля, в которой перечислены все заданные поля. Затем вы можете передать возвращенную маску непосредственно в вызов обновления.
FieldMasks::all_set_fields_of() – это удобный метод для FieldMasks::field_mask(). Он сравнивает переданный объект с пустым объектом того же класса. В приведенном выше коде вы также можете использовать:
field_mask(
Google::Ads::GoogleAds::V26::Resources::Campaign->new({}),
$campaign
)
вместо all_set_fields_of($campaign).
Как создать маску вручную
Чтобы создать маску поля с нуля, сначала создайте объект Google::Ads::GoogleAds::Common::FieldMask, затем создайте ссылку на массив, заполненный названиями всех полей, которые вы хотите изменить, и, наконец, назначьте ссылку на массив полю paths маски поля:
my $field_mask = Google::Ads::GoogleAds::Common::FieldMask->new({
paths => ["status", "name"],
});
Как обновить поля объекта и их подполя
У полей объекта могут быть вложенные поля (например, MaximizeConversions, которое включает вложенные поля, такие как target_cpa_micros), или их может не быть (например, ManualCpm).
Поля объектов без определенных подполей
Поле объекта в Perl эквивалентно protobuf MESSAGE в клиентских библиотеках, работающих на gRPC. При обновлении поля объекта, для которого не определены подполя, используйте утилиту FieldMasks, чтобы сгенерировать маску поля, как описано в предыдущем разделе.
Поля объектов с определенными подполями
При обновлении поля объекта, определенного с помощью подполей, без явного указания какого-либо из подполей в этом сообщении, необходимо вручную добавить каждое из изменяемых подполей объекта в FieldMask, как в предыдущем примере, в котором маска поля создается с нуля.
Например, вы можете изменить стратегию назначения ставок в кампании, не задав никаких полей в новой стратегии. В примере ниже показано, как изменить стратегию назначения ставок в кампании на MaximizeConversions, не задавая значения для вложенных полей.
В этом случае методы all_set_fields_of() и field_mask() утилиты FieldMasks не помогут достичь цели.
В следующем примере создается маска поля, включающая maximize_conversions. Однако в Google Ads API это не допускается, чтобы предотвратить случайную очистку полей. В результате возникает ошибка FieldMaskError.FIELD_HAS_SUBFIELDS.
# 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],
});
В примере ниже показано, как правильно обновить кампанию, чтобы использовать стратегию назначения ставок MaximizeConversions, не задавая ее подполя.
# 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,
});
Очистить поля
Поля можно очистить, добавив их в маску, как показано в примере выше, или задав для них пустое или неопределенное значение.
Например, у вас есть кампания, в которой используется стратегия назначения ставок MaximizeConversions, а в поле target_cpa_micros задано значение, превышающее 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),
});
Обратите внимание, что поля с вложенными подполями можно очистить, только удалив каждое из подполей по отдельности, как показано в разделе Поля объектов с определенными подполями.