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

Google Ads API では、一部のメッセージ フィールドは空のメッセージ オブジェクト(campaign.manual_cpm など)として定義されます。また、設定を必要としないオプション フィールド(campaign.manual_cpc など)のみを含めることもできます。このフィールドを設定することは、特定のキャンペーンに対してどの入札戦略を使用するかを API に指定するうえで重要ですが、メッセージが空の場合には直感的でありません。

文字列である campaign.name フィールドを更新するときは、通常の Python オブジェクト属性のようにフィールドを直接更新してフィールドを設定します。

campaign.name = "Test campaign value"

campaign.manual_cpc はネストされたフィールドです。つまり、文字列などのプリミティブ型ではなく、別の protobuf メッセージが含まれています。次のように、フィールドを直接更新することもできます。

campaign.manual_cpc.enhanced_cpc_enabled = True

これにより、このキャンペーンには拡張クリック単価を有効にした入札戦略が manual_cpc であることが API に通知されます。

しかし、空の manual_cpm を使用したい場合はどうすればよいでしょうか。または、拡張クリック単価を有効にせずにmanual_cpc?これを行うには、クラスの個別の空のインスタンスをキャンペーンにコピーする必要があります。次に例を示します。

client = GoogleAdsClient.load_from_storage()

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

campaign オブジェクトに manual_cpm を指定する点に注意してください。

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

manual_cpm フィールドは設定されていますが、どのフィールドにも値がありません。このパターンを使用する API にリクエストを送信するときに、ロギングを有効にしてリクエスト ペイロードを調べることで、空のメッセージ オブジェクトが正しく設定されていることを確認できます。

最後に、このフィールドをリクエスト オブジェクトの update_mask に手動で追加する必要があります。フィールド マスク ヘルパーには、空のオブジェクトに明示的に設定されたフィールドと、設定されていないフィールドの違いを判別するメカニズムはありません。

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