Definir objetos de mensagem vazios como campos

Na API Google Ads, alguns campos de mensagem são usados para indicar uma opção de estratégia de lances para um Campaign. Eles podem ser:

Os campos de estratégia de lances em Campaign pertencem a um grupo bidding_strategy oneof. Definir uma nova estratégia de lances, como manual_cpm ou manual_cpc, limpa implicitamente qualquer estratégia de lances configurada anteriormente naquele grupo oneof.

Para atualizar um campo primitivo como campaign.name, defina-o diretamente:

campaign.name = "Test campaign value"

Para atualizar uma mensagem aninhada com subcampos definíveis, como campaign.manual_cpc ao ativar o CPC otimizado, defina-o da seguinte maneira:

campaign.manual_cpc.enhanced_cpc_enabled = True

Definir mensagens realmente vazias

Para usar uma estratégia de lances como manual_cpm, que é uma mensagem vazia:

  1. Receba uma instância vazia do tipo de mensagem (ManualCpm).
  2. Use client.copy_from para atribuir essa instância vazia ao campo da campanha.
  3. Adicione manualmente o nome do campo (manual_cpm) ao update_mask no CampaignOperation. O ajudante de máscara de campo não consegue detectar automaticamente que uma mensagem vazia foi definida explicitamente.
from google.ads.googleads import util
from google.ads.googleads.client import GoogleAdsClient
from google.api_core.protobuf_helpers import field_mask

client = GoogleAdsClient.load_from_storage()
# Assume 'campaign' is an existing Campaign object you are updating.

# 1. Get an empty ManualCpm type.
empty_cpm = client.get_type("ManualCpm")

# 2. Copy it to the campaign's manual_cpm field.
client.copy_from(campaign.manual_cpm, empty_cpm)

# 3. Create the operation and manually add "manual_cpm" to the update_mask.
campaign_operation = client.get_type("CampaignOperation")
client.copy_from(campaign_operation.update, campaign)
client.copy_from(
    campaign_operation.update_mask,
    field_mask(None, util.convert_proto_plus_to_protobuf(campaign)),
)
campaign_operation.update_mask.paths.append("manual_cpm")

# The resulting proto sent to the API will include:
# manual_cpm {
# }

Definir mensagens com subcampos opcionais

Para usar manual_cpc como estratégia de lances sem ativar enhanced_cpc_enabled, tente uma abordagem semelhante a ManualCpm. No entanto, como ManualCpc tem subcampos, adicionar manual_cpc ao update_mask resulta em um erro FieldMaskError.FIELD_HAS_SUBFIELDS. A API requer mais especificidade quando uma mensagem na máscara tem subcampos.

Para definir campaign.manual_cpc corretamente e garantir que enhanced_cpc_enabled permaneça indefinido:

  1. Instancie um objeto ManualCpc vazio e copie-o para campaign.manual_cpc usando client.copy_from.
  2. Adicione manualmente o caminho a cada subcampo mutável de ManualCpc ao update_mask no CampaignOperation. Nesse caso, o subcampo relevante é enhanced_cpc_enabled.
from google.ads.googleads import util
from google.ads.googleads.client import GoogleAdsClient
from google.api_core.protobuf_helpers import field_mask

client = GoogleAdsClient.load_from_storage()
# Assume 'campaign' is an existing Campaign object you are updating.

# 1. Copy an empty ManualCpc object into campaign.manual_cpc.
client.copy_from(campaign.manual_cpc, client.get_type("ManualCpc"))

# 2. Manually add the subfield path to the update_mask.
campaign_operation = client.get_type("CampaignOperation")
client.copy_from(campaign_operation.update, campaign)
client.copy_from(
    campaign_operation.update_mask,
    field_mask(None, util.convert_proto_plus_to_protobuf(campaign)),
)

# For ManualCpc, because it has subfields, you must specify the subfield
# path in the update_mask. This tells the API you are updating something
# within manual_cpc. By not setting enhanced_cpc_enabled on the campaign
# object, it defaults to false.
campaign_operation.update_mask.paths.append("manual_cpc.enhanced_cpc_enabled")

# The update_mask paths will include: ['manual_cpc.enhanced_cpc_enabled']
# This correctly signals to the API that ManualCpc is the chosen strategy,
# with enhanced_cpc_enabled in its default state.

Ao enviar solicitações usando esses padrões, é possível verificar o payload ativando o registro em log e inspecionando a solicitação.