En la API de Google Ads, las actualizaciones se realizan mediante una máscara de campo. La máscara de campo enumera todos los campos que quieres cambiar con la actualización y los campos especificados que no estén en la máscara de campo se ignorarán, incluso si se envían al servidor.
FieldMaskUtil
La forma recomendada de generar máscaras de campo es usar nuestra máscara de campo integrada que te permite generar máscaras de campo a partir de un objeto modificado, en lugar de construirlos desde cero.
A continuación, le mostramos un ejemplo de cómo actualizar una campaña:
// 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 });
Primero, crearemos un objeto Campaign
vacío. Luego, configuramos su nombre de recurso para
para que la API sepa exactamente qué campaña estamos actualizando.
En el ejemplo, se usa el método FieldMasks.AllSetFieldsOf
en la campaña
automáticamente generará una máscara de campo que enumere todos los campos establecidos. Luego, puedes
pasa la máscara mostrada directamente a la llamada de actualización.
A veces, es posible que debas trabajar con un objeto existente y actualizar algunos campos. En esos casos, debes modificar el código de la siguiente manera:
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)
};
Para crear una máscara de campo desde cero, primero debes crear una
FieldMask
Luego, crea un array propagado con los nombres de todos los campos que desees
para cambiar y, por último, agrega el contenido del array al campo Path
de la máscara de campo.
FieldMask fieldMask = new FieldMask();
fieldMask.Paths.AddRange(new string[] { "status", "name" });
Actualiza los campos de mensaje y sus subcampos
Los campos MESSAGE
pueden tener subcampos (como
MaximizeConversions
, que tiene tres:
target_cpa_micros
,
cpc_bid_ceiling_micros
y cpc_bid_floor_micros
), o pueden no tener ninguno
en absoluto (por ejemplo, ManualCpm
).
Campos de mensaje sin subcampos definidos
Cuando actualices un campo MESSAGE
que no esté definido con ningún subcampo, usa
FieldMasks
para generar una máscara de campo, como se describió anteriormente.
Campos de mensaje con subcampos definidos
Cuando se actualiza un campo MESSAGE
definido con subcampos sin
de forma explícita ninguno de los subcampos en ese mensaje, debes
agregar cada uno de los subcampos MESSAGE
mutables a FieldMask
, similar a lo siguiente:
del ejemplo anterior que crea una máscara de campo desde cero.
Un ejemplo común es actualizar la estrategia de ofertas de una campaña sin establecer ninguna
de los campos en la nueva estrategia de ofertas. El siguiente ejemplo demuestra cómo
actualizar una campaña para utilizar la
Estrategia de ofertas de MaximizeConversions
sin configurar ninguno de los subcampos de la estrategia de ofertas.
En este caso, usando los métodos AllSetFieldsOf()
y FromChanges()
de
FieldMasks
no logra el objetivo previsto.
En el siguiente ejemplo, se genera una máscara de campo que incluye
maximize_conversions
Sin embargo, la API de Google Ads no permite que este comportamiento
para evitar borrar campos accidentalmente y producir una
FieldMaskError.FIELD_HAS_SUBFIELDS
.
// 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()
};
// Constructs an operation, using the FieldMasks' AllSetFieldsOf utility to
// derive the update mask. The field mask will include 'maximize_conversions`,
// which will produce a FieldMaskError.FIELD_HAS_SUBFIELDS error.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = FieldMasks.AllSetFieldsOf(campaign)
};
// Sends the operation in a mutate request that will result in a
// FieldMaskError.FIELD_HAS_SUBFIELDS error because empty MESSAGE fields cannot
// be included in a field mask.
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });
El siguiente ejemplo demuestra cómo actualizar correctamente una campaña para usar la
Estrategia de ofertas de MaximizeConversions
sin configurar ninguno de sus subcampos.
// Creates a Campaign object with the proper resource name.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
};
// Creates a field mask from the existing campaign and adds all of the fields
// on the MaximizeConversions bidding strategy to the field mask. Because these
// fields are included in the field mask but excluded from the campaign object,
// the Google Ads API will set the campaign's bidding strategy to a
// MaximizeConversions object with none of its subfields set.
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
};
Limpieza de campos
Algunos campos se pueden borrar de forma explícita. Al igual que en el ejemplo anterior, debes
agregar explícitamente estos campos a la máscara de campo. Por ejemplo, supongamos que tienes un
campaña que usa una estrategia de ofertas MaximizeConversions
y que la
El campo target_cpa_micros
se configura con un valor mayor que 0.
Se ejecuta el siguiente código: Sin embargo, la función maximize_conversions.target_cpa_micros
no se agregará a la máscara de campo, por lo que no se realizarán cambios en la
Campo target_cpa_micros
:
// Creates a campaign with the proper resource name and a MaximizeConversions
// object with target_cpa_micros set 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 });
En el siguiente ejemplo, se muestra cómo borrar correctamente target_cpa_micros
en la estrategia de ofertas MaximizeConversions
.
// 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
};
Ten en cuenta que la sección “incorrecto” ejemplo anterior funciona según lo previsto para los campos que
se definen como optional
en la API de Google Ads.
protocol buffers
Sin embargo, como el
target_cpa_micros
no es un campo optional
, el campo "incorrecto" ejemplo no actualiza la
de oferta para borrar el campo target_cpa
.