空のメッセージ オブジェクトをフィールドとして設定する

Google 広告 API では、一部のメッセージ フィールドを使用して、 入札戦略の選択を示しますCampaign。 たとえば、次のようなものがあります。

  • 完全に空のメッセージ: たとえば、campaign.manual_cpm には サブフィールドが定義されていません。
  • オプション フィールドを含むメッセージ: たとえば、 campaign.manual_cpc には省略可のサブフィールド enhanced_cpc_enabled があります。

Campaign の入札戦略フィールドは、 bidding_strategy oneof グループに属します。manual_cpm や manual_cpc などの新しい入札戦略を設定すると、その oneof グループで以前に構成された入札戦略は暗黙的にクリアされます。

campaign.name などのプリミティブ フィールドを更新するには、直接設定します。

campaign.name = "Test campaign value"

拡張クリック単価を有効にする際に、設定可能なサブフィールドを持つネストされたメッセージ(campaign.manual_cpc など)を更新するには、次のように設定します。

campaign.manual_cpc.enhanced_cpc_enabled = True

完全に空のメッセージを設定する

manual_cpm などの空の メッセージである入札戦略を使用するには:

  1. メッセージ タイプ(ManualCpm)の空のインスタンスを取得します。
  2. client.copy_from を使用して、この空のインスタンスをキャンペーンのフィールドに割り当てます。
  3. CampaignOperation の update_mask にフィールド名(manual_cpm)を手動で追加します。 フィールド マスク ヘルパーは、 空のメッセージが明示的に設定されていることを自動的に検出できません。
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 {
# }

省略可のサブフィールドを含むメッセージを設定する

enhanced_cpc_enabled を有効にせずに manual_cpc を入札戦略として使用するには、 ManualCpm と同様の方法を試すことができます。ただし、ManualCpc には サブフィールドがあるため、manual_cpc を update_mask に追加すると、 FieldMaskError.FIELD_HAS_SUBFIELDS エラーが発生します。マスク内のメッセージにサブフィールドがある場合、API にはより具体的な指定が必要です。

enhanced_cpc_enabled を設定しないまま campaign.manual_cpc を正しく設定するには:

  1. 空の ManualCpc オブジェクトをインスタンス化し、 campaign.manual_cpc を使用して client.copy_from にコピーします。
  2. update_mask の CampaignOperation に、ManualCpc の変更可能な各サブフィールドへのパスを手動で追加します。この場合、関連するサブフィールドは 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.

これらのパターンを使用してリクエストを送信する場合は、 ロギングを有効にしてリクエストを検査することで、ペイロードを確認できます。