Na API Google Ads, as atualizações são feitas usando uma máscara de campo. A máscara de campo lista todos os campos que você pretende alterar com a atualização, e todos os campos especificados que não estão na máscara de campo são ignorados, mesmo que sejam enviados ao servidor.
Utilitário FieldMasks
A maneira recomendada de gerar máscaras de campo é usar nosso utilitário integrado (FieldMasks), que permite gerar máscaras de campo
com base em um objeto modificado, em vez de criá-las do zero.
Veja um exemplo de como atualizar uma campanha:
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),
});
Este exemplo cria um objeto Campaign definindo o nome do recurso com o utilitário ResourceNames para que a API saiba qual campanha está sendo atualizada.
O exemplo usa o método FieldMasks::all_set_fields_of() na campanha para produzir automaticamente uma máscara de campo que enumera todos os campos definidos. Em seguida, transmita a máscara retornada diretamente para a chamada de atualização.
FieldMasks::all_set_fields_of() é um método de conveniência para
FieldMasks::field_mask(). Ele compara o objeto transmitido a
um objeto vazio da mesma classe. No código anterior, você também pode usar:
field_mask(
Google::Ads::GoogleAds::V26::Resources::Campaign->new({}),
$campaign
)
em vez de all_set_fields_of($campaign).
Criar uma máscara manualmente
Para criar uma máscara de campo do zero, primeiro crie um objeto
Google::Ads::GoogleAds::Common::FieldMask, depois
faça uma referência de matriz preenchida com os nomes de todos os campos que você pretende
mudar e, por fim, atribua a referência de matriz ao campo paths
da máscara de campo:
my $field_mask = Google::Ads::GoogleAds::Common::FieldMask->new({
paths => ["status", "name"],
});
Atualizar campos de objeto e os subcampos deles
Os campos de objeto podem ter subcampos (como
MaximizeConversions, que inclui subcampos como
target_cpa_micros) ou não ter nenhum (como
ManualCpm).
Campos de objeto sem subcampos definidos
Um campo de objeto em Perl é equivalente a um MESSAGE de protobuf em bibliotecas de cliente
em execução no gRPC. Ao atualizar um campo de objeto que não está definido
com subcampos, use o utilitário FieldMasks para gerar uma máscara de campo, conforme
descrito na seção anterior.
Campos de objeto com subcampos definidos
Ao atualizar um campo de objeto definido com subcampos sem definir explicitamente
nenhum dos subcampos nessa mensagem, é necessário adicionar manualmente cada um dos
subcampos de objeto mutáveis ao FieldMask, de maneira semelhante ao exemplo anterior,
que cria uma máscara de campo do zero.
Um exemplo comum é atualizar a estratégia de lances de uma campanha sem definir nenhum dos campos na nova estratégia. O exemplo a seguir demonstra como atualizar uma campanha para usar a estratégia de lances MaximizeConversions sem definir nenhum dos subcampos na estratégia de lances.
Nesse caso, o uso dos métodos all_set_fields_of() e field_mask() do utilitário FieldMasks não alcança o objetivo pretendido.
O exemplo a seguir gera uma máscara de campo que inclui
maximize_conversions. No entanto, a API Google Ads não permite esse comportamento para
evitar a limpeza acidental de campos e gera um erro
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],
});
O exemplo a seguir demonstra como atualizar corretamente uma campanha para usar a estratégia de lances MaximizeConversions sem definir nenhum dos subcampos.
# 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,
});
Limpar campos
Os campos podem ser limpos explicitamente adicionando-os à máscara de campo, como mostrado no
exemplo anterior, ou definindo o campo como um valor vazio ou indefinido.
Por exemplo, imagine que você tem uma campanha que usa uma estratégia de lances MaximizeConversions e que o campo target_cpa_micros está definido com um valor maior que 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),
});
Os campos com subcampos aninhados só podem ser limpos se cada um dos subcampos individuais for limpo, conforme demonstrado em Campos de objeto com subcampos definidos.