Leere Nachrichtenobjekte als Felder festlegen

In der Google Ads API sind einige Nachrichtenfelder als leere Nachrichtenobjekte definiert (z. B. campaign.manual_cpm) oder sie enthalten möglicherweise nur optionale Felder, die nicht festgelegt werden müssen (z. B. campaign.manual_cpc). Das Festlegen dieser Felder ist wichtig, um der API mitzuteilen, welche Gebotsstrategie für die jeweilige Kampagne verwendet werden soll. Dies ist jedoch nicht intuitiv, wenn die Nachrichten leer sind.

Beim Aktualisieren des Feldes campaign.name, bei dem es sich um einen String handelt, legen wir das Feld fest, indem wir es direkt wie ein normales Python-Objektattribut aktualisieren:

campaign.name = "Test campaign value"

campaign.manual_cpc ist ein verschachteltes Feld, d. h. es enthält eine andere protobuf-Nachricht und keinen primitiven Typ wie einen String. Sie können die Felder der Felder auch direkt aktualisieren:

campaign.manual_cpc.enhanced_cpc_enabled = True

So wird der API mitgeteilt, dass die Gebotsstrategie dieser Kampagne manual_cpc mit aktiviertem auto-optimiertem CPC verwendet wird.

Aber was ist, wenn Sie manual_cpm verwenden möchten, das aber leer ist? Oder manual_cpc, ohne den auto-optimierten CPC zu aktivieren? Dazu müssen Sie eine separate leere Instanz der Klasse in die Kampagne kopieren. Beispiel:

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 enthält Werte. Wenn Sie eine Anfrage an die API senden, die dieses Muster verwendet, können Sie überprüfen, ob Sie das leere Nachrichtenobjekt richtig festgelegt haben. Dazu aktivieren Sie logging und prüfen die Nutzlast der Anfrage.

Zum Schluss müssen Sie dieses Feld manuell in das update_mask des Anfrageobjekts einfügen. Das Hilfsprogramm für Feldmasken hat keinen Mechanismus, um den Unterschied zwischen einem Feld, das explizit auf ein leeres Objekt festgelegt wurde, und einem Feld zu ermitteln, das nicht festgelegt wurde.

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")