Leere Nachrichtenobjekte als Felder festlegen

In der Google Ads API sind einige Nachrichtenfelder als leere Nachrichtobjekte definiert, z. B. campaign.manual_cpm. Sie können auch nur optionale Felder enthalten, die nicht festgelegt werden müssen, z. B. campaign.manual_cpc. Es ist wichtig, diese Felder festzulegen, um der API mitzuteilen, welche Gebotsstrategie für die jeweilige Kampagne verwendet werden soll. Wenn die Nachrichten leer sind, ist das jedoch nicht intuitiv.

Wenn wir das Feld campaign.name aktualisieren, das ein String ist, legen wir das Feld fest, indem wir es direkt aktualisieren, als wäre es ein normales Python-Objektattribut:

campaign.name = "Test campaign value"

campaign.manual_cpc ist ein verschachteltes Feld. Es enthält also eine weitere Protobuf-Nachricht und keinen primitiven Typ wie einen String. Sie können die Felder auch direkt aktualisieren:

campaign.manual_cpc.enhanced_cpc_enabled = True

Dadurch wird der API mitgeteilt, dass für diese Kampagne die Gebotsstrategie manual_cpc mit aktiviertem auto-optimierten CPC verwendet wird.

Was aber, wenn Sie manual_cpm verwenden möchten, das leer ist? Oder manual_cpc ohne auto-optimierte CPC-Gebote zu aktivieren? Dazu müssen Sie eine separate leere Instanz der Klasse in die Kampagne kopieren, z. B.:

client = GoogleAdsClient.load_from_storage()

empty_cpm = client.get_type('ManualCpm')
client.copy_from(campaign.manual_cpm, empty_cpm)

Beachten Sie, wie manual_cpm für das campaign-Objekt angegeben wird:

name {
  value: "Test campaign value"
}
manual_cpm {
}

Das Feld manual_cpm ist festgelegt, aber keines seiner Felder hat Werte. Wenn Sie Anfragen an die API senden, die dieses Muster verwenden, können Sie prüfen, ob Sie das leere Nachrichtenobjekt richtig festlegen, indem Sie die Protokollierung aktivieren und die Anfrage-Nutzlast untersuchen.

Schließlich müssen Sie dieses Feld manuell dem update_mask des Anfrageobjekts hinzufügen. Das Hilfsprogramm für Feldmasken kann nicht zwischen einem Feld, das explizit auf ein leeres Objekt gesetzt wurde, und einem Feld, das nicht festgelegt wurde, unterscheiden.

from google.api_core.protobuf_helpers import field_mask

campaign_operation.create = campaign
campaign_operation.update_mask = field_mask(None, campaign)
# Here we manually add the "manual_cpm" field
campaign_operation.update_mask.append("manual_cpm")