W interfejsie Google Ads API maska pola służy do podawania listy pól, które żądanie interfejsu API powinno zaktualizować. Wszystkie pola, które nie są określone w polu maski, zostaną zignorowane, nawet jeśli zostaną wysłane na serwer.
Klasa FieldMaskUtil
Zalecany sposób generowania masek pól to użycie wbudowanej klasy FieldMaskUtil
, która umożliwia generowanie masek pól ze zmodyfikowanego obiektu zamiast tworzenia ich od zera.
Oto przykład aktualizowania kampanii, w którym użyto metody FieldMasks.AllSetFieldsOf
do utworzenia maski pola zawierającej wszystkie ustawione pola. Wygenerowaną maskę pola możesz następnie przekazać bezpośrednio do wywołania aktualizacji.
// 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 });
Czasami może być konieczne zmodyfikowanie istniejącego obiektu i zaktualizowanie kilku pól. W takich przypadkach zmodyfikuj kod, aby zamiast tego używać metody FieldMasks.FromChanges
. Ta metoda generuje maskę pola, która reprezentuje różnicę między 2 obiektami.
Campaign existingCampaign;
// Obtain existingCampaign from elsewhere.
...
// Create a new campaign based off 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)
};
Jak radzić sobie z błędami FieldMaskError.FIELD_HAS_SUBFIELDS
W rzadkich przypadkach może być konieczne ustawienie pola bez aktualizowania żadnych pól podrzędnych tego typu. Przyjrzyj się temu przykładowi:
// 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 });
To wywołanie interfejsu API zakończy się niepowodzeniem i zwróci błąd FieldMaskError.FIELD_HAS_SUBFIELDS
.
Ponieważ pole MaximizeConversions
ma 3 pola podrzędne, serwer interfejsu Google Ads API oczekuje, że w żądaniu będą obecne maski pól dla tych pól. W tej sytuacji FieldMaskUtil
nie może jednak prawidłowo wygenerować masek pól, ponieważ żądanie nie ustawia tych pól.
W takich przypadkach możesz ręcznie edytować maskę pola w ten sposób:
// 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 here:
// https://developers.google.com/google-ads/api/docs/campaigns/bidding/assign-strategies
fieldMask.Paths.AddRange(new string[] {
"maximize_conversions.target_cpa_micros",
});
// Creates an operation to update the campaign with the specified fields.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = fieldMask
};
Jak wyczyścić pola
Interfejs Google Ads API obsługuje czyszczenie niektórych wartości pól. Aby wyczyścić pole, musisz ręcznie ustawić maskę pola dla tego pola. Ustawienie pola na wartość domyślną (np. zero w przypadku pola int64) nie spowoduje wyczyszczenia pola.
Poniższy przykład kodu pokazuje, jak wyczyścić pole target_cpa_micros
strategii ustalania stawek MaximizeConversions
.
Prawidłowy kod
Ten kod czyści pole target_cpa_micros
, ponieważ ustawiamy maximize_conversions.target_cpa_micros
w masce pola i nie ustawiamy pola 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 will
// clear this field from the bidding strategy without impacting any other fields
// on the bidding strategy.
FieldMask fieldMask = FieldMasks.AllSetFieldsOf(campaign);
fieldMask.Paths.AddRange(new string[] {
"maximize_conversions.target_cpa_micros",
});
// Creates an operation to update the campaign with the specified field.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = fieldMask
};
Nieprawidłowy kod
Poniższy kod nie czyści pola target_cpa_micros
, ponieważ ustawiamy w nim wartość zero. Zarówno FieldMaskUtils
, jak i serwer interfejsu Google Ads API zignorują tę wartość. W takim przypadku możesz też nie otrzymać błędu, ponieważ serwer zignorował wartość.
// Creates a campaign with the proper resource name and a MaximizeConversions
// object. Attempt 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 the FieldMasks' AllSetFieldsOf utility to
// derive the update mask. However, the field mask will NOT include
// 'maximize_conversions.target_cpa_micros'.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = FieldMasks.AllSetFieldsOf(campaign)
};
// Sends the operation in a mutate request that will succeed but will NOT update
// the 'target_cpa_micros' field because 'maximize_conversions.target_cpa_micros'
// was not included in the field mask.
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });