Na API Google Ads, uma máscara de campo é usada para fornecer uma lista de campos que uma solicitação de API deve atualizar. Qualquer campo que não seja especificado na máscara de campo será ignorado, mesmo que seja enviado ao servidor.
Classe FieldMasks
A maneira recomendada de gerar máscaras de campo na biblioteca de cliente .NET é usar
a classe utilitária FieldMasks integrada, que permite gerar máscaras de campo
de um objeto modificado em vez de criá-las do zero.
Confira um exemplo de como atualizar uma campanha que usa o método
FieldMasks.AllSetFieldsOf para produzir uma máscara de campo que enumera todos os campos
definidos. Em seguida, transmita a máscara de campo gerada diretamente para a chamada de atualização:
// Update campaign by setting its status to paused, and "Search network" to
// false.
Campaign campaignToUpdate = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
Status = CampaignStatus.Paused,
NetworkSettings = new NetworkSettings()
{
TargetSearchNetwork = false
}
};
// Create the operation.
CampaignOperation operation = new CampaignOperation()
{
Update = campaignToUpdate,
UpdateMask = FieldMasks.AllSetFieldsOf(campaignToUpdate)
};
// Update the campaign.
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });
Às vezes, é necessário trabalhar com um objeto existente e atualizar alguns
campos. Nesses casos, use o método FieldMasks.FromChanges. Esse método gera uma máscara de campo que representa a diferença entre dois objetos:
Campaign existingCampaign;
// Obtain existingCampaign from an earlier API call.
// Create a new campaign based on the existing campaign for update.
Campaign campaignToUpdate = new Campaign(existingCampaign);
// Update campaign by setting its status to paused, and "Search network" to
// false.
campaignToUpdate.Status = CampaignStatus.Paused;
campaignToUpdate.NetworkSettings = new NetworkSettings()
{
TargetSearchNetwork = false
};
// Create the operation.
CampaignOperation operation = new CampaignOperation()
{
Update = campaignToUpdate,
UpdateMask = FieldMasks.FromChanges(existingCampaign, campaignToUpdate)
};
Processar erros FieldMaskError.FIELD_HAS_SUBFIELDS
Em raras ocasiões, talvez seja necessário definir um campo de mensagem sem atualizar nenhum dos subcampos dele. Veja o exemplo a seguir:
// Creates a campaign with the proper resource name and an empty
// MaximizeConversions field.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
MaximizeConversions = new MaximizeConversions()
};
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = FieldMasks.AllSetFieldsOf(campaign)
};
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });
Essa chamada de API falha com um erro FieldMaskError.FIELD_HAS_SUBFIELDS. Como MaximizeConversions tem subcampos, o servidor da API Google Ads espera que as máscaras de campo dos subcampos mutáveis estejam presentes na solicitação. No entanto, o FieldMasks não pode gerar máscaras de subcampos automaticamente
nessa situação porque a solicitação não define nenhum subcampo.
Nesses casos, é possível adicionar manualmente caminhos a fieldMask.Paths (que é um
RepeatedField<string>):
// Creates a Campaign object with the proper resource name.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
};
FieldMask fieldMask = FieldMasks.AllSetFieldsOf(campaign);
// 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 at:
// https://developers.google.com/google-ads/api/docs/campaigns/bidding/assign-strategies
fieldMask.Paths.Add("maximize_conversions.target_cpa_micros");
// Creates an operation to update the campaign with the specified fields.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = fieldMask
};
Limpar campos
A API Google Ads permite limpar alguns valores de campo. Para limpar um campo, inclua manualmente esse campo na máscara, deixando-o sem definição no objeto de recurso. Definir um campo como o valor padrão dele (como 0 para um campo
int64) não limpa o campo.
O exemplo de código a seguir mostra como limpar o campo target_cpa_micros de uma
estratégia de lances MaximizeConversions:
Código correto
O código a seguir limpa o campo target_cpa_micros porque adiciona
maximize_conversions.target_cpa_micros à máscara de campo sem definir
a propriedade campaign.MaximizeConversions.TargetCpaMicros:
// Creates a Campaign object with the proper resource name.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
};
// Constructs a field mask from the existing campaign and adds the
// 'maximize_conversions.target_cpa_micros' field to the field mask, which
// clears this field from the bidding strategy without impacting any other
// fields on the bidding strategy.
FieldMask fieldMask = FieldMasks.AllSetFieldsOf(campaign);
fieldMask.Paths.Add("maximize_conversions.target_cpa_micros");
// Creates an operation to update the campaign with the specified field.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = fieldMask
};
Código incorreto
O código a seguir não limpa o campo target_cpa_micros, porque
ele define o campo como 0. O utilitário FieldMasks e o servidor da API Google Ads ignoram esse valor quando TargetCpaMicros é 0 ou quando o caminho é omitido da máscara, e o servidor não retorna um erro:
// Creates a campaign with the proper resource name and a
// MaximizeConversions object. Attempts to clear the target_cpa_micros
// field by setting it to 0.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
MaximizeConversions = new MaximizeConversions()
{
TargetCpaMicros = 0
}
};
// Constructs an operation using FieldMasks.AllSetFieldsOf to derive the
// update mask.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = FieldMasks.AllSetFieldsOf(campaign)
};
// Sends the operation in a mutate request that succeeds without clearing
// the previous 'target_cpa_micros' value cleanly.
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });