アセットベースの広告表示オプションの移行

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このドキュメントでは、フィードベースの拡張機能の移行と廃止のプロセスについて説明します。フィードベースの広告表示オプションは、新しいアセットベースの広告表示オプションに一括して移行され、2023 年に完全に廃止されます。

概要

既存のフィードベースの広告表示オプションはサポートが終了し、アセットベースの広告表示オプションに置き換えられました。アセットベースの拡張機能を使用すると、拡張機能の作成と管理の複雑さが軽減されます。広告表示オプションを確実に管理するには、ご対応が必要です。

「フィードベースの拡張機能」という用語は、次のサービスに関連するリソースまたは機能を指します。

特定のタイプのアセットベースとフィードベースの広告表示オプションの両方が同じ顧客、キャンペーン、または広告グループに適用されている場合は、アセットベースの広告表示オプションが配信されます。これは、同じレベルのエンティティにのみ適用されます。たとえば、アセットを広告グループにリンクすると、その広告グループのすべてのフィードが配信されなくなりますが、同じキャンペーンの他の広告グループでは引き続きフィードが配信される可能性があります。アセットベースの広告表示オプションは、Google 広告の管理画面にもデフォルトで表示されます。

どちらの種類の広告表示オプションも有効な場合は、以下のスクリーンショットのように、Google 広告の管理画面の [広告表示オプション] ページに通知が表示されることがあります。「従来版」の広告表示オプションはフィードベースの広告表示オプションで、「アップグレード版」の広告表示オプションはアセットベースです。

アップグレードされたプロモーション画面

アセットベースの広告表示オプションを作成すると、デフォルトで [アップグレード済み] の広告表示オプションが表示されます。

移行の詳細

フィードは、既存の値を新しいアセットベースの拡張インスタンスにコピーして移行されます。既存のフィードベースの広告表示オプションは、特定の日付にアセットベースの広告表示オプションに自動的にコピーされます。アセットベースのすべての拡張機能で、新しい一意の ID 値が使用されます。

自動移行中に作成されたアセットと元のフィードとの間に接続はないため、Google Ads API を介して移行プロセスをご自身で行うことをおすすめします。

移行スケジュール

既存のフィードベースの広告表示オプションはすべて、アセットベースの広告表示オプションに一括で自動的に移行されます。移行されたアカウントは、フィードベースのエンティティに対する変更呼び出しを拒否します。

過去のフィード レポートは、2022 年 8 月まで引き続きご利用いただけます。 フィードベースの拡張機能では、移行後に新しいデータは生成されなくなります。

自動移行プロセスでは、現在のフィードベースの拡張機能と同等のアセットベースの拡張機能が作成され、AdGroupFeedCampaignFeedCustomerFeed のすべてが同等の AdGroupAssetCampaignAssetCustomerAsset に置き換えられます。広告グループ、キャンペーン、または顧客がすでにアセットに関連付けられている場合、対応するフィードは無視されます。

アセットベースの広告表示オプションの変更

アセットベースの広告表示オプションは既存のフィードベースの広告表示オプションと同じ機能を提供しますが、マッチング関数やほとんどのターゲティング フィールドなど、既存の機能の一部は削除されました。

ターゲティングでは、広告グループ、キャンペーン、キーワード、地域、モバイルの各フィールドは、アセットベースの広告表示オプションでは使用できません。

アセットベースの一部の広告表示オプションでは、特定の項目を使用できません。次のフィールドは削除され、自動的に移行されません。

  • アプリ: 広告のスケジュール
  • 通話: 開始時間、終了時間
  • 価格: 開始時間、終了時間、広告のスケジュール
  • 構造化スニペット: 開始時間、終了時間、広告のスケジュール

日付関連のすべてのフィールドが「yyyy-MM-dd」形式になりました。アセットベースの広告表示オプションの日付フィールドに時刻を指定することはできません。

今後、アセットベースの広告表示オプションを使用する場合は、キャンペーンと広告グループのレベルですでに利用できるターゲティング機能を使用することをおすすめします。モバイル設定の場合は、リンクにモバイル フレンドリーな URL を含めることを検討してください。

マッチング関数は、アセットベースの拡張機能では利用できません。自動移行では、次のマッチング関数のみが適用されます。

マッチング関数 移行メモ
EQUALS(FEED_ITEM_ID, 1234567) そのまま移行
IN(FEED_ITEM_ID,{1234567,1234568,1234569}) そのまま移行
IDENTITY(false) excluded_parent_asset_field_types として移行
IDENTITY(true) 下記の特殊なケースを除き、リンクされたすべてのフィード アイテムとともに移行しました。
AND(
IN(FEED_ITEM_ID,{1234567,1234568,1234569}),
EQUALS(CONTEXT.DEVICE,"Mobile"))
IN(FEED_ITEM_ID,{1234567,1234568,1234569}) として移行
AND(
EQUALS(FEED_ITEM_ID, 1234567),
EQUALS(CONTEXT.DEVICE,"Mobile"))
EQUALS(FEED_ITEM_ID,1234567) として移行

IDENTITY(true) 特殊なケース

IDENTITY(true) マッチング関数は、拡張機能に関連付けられていて、20 個を超えるアクティブなフィード アイテムと一致する場合、自動移行中に無視されます。マッチング関数を IN(FEED_ITEM_ID, {1234567,1234568,1234569}) 表記に更新する必要があります。

また、広告表示オプションを自分で移行し、アセットベースの広告表示オプションを他のエンティティにリンクすることもできます。それぞれの顧客、キャンペーン、広告グループは、同じ広告表示オプションの有効なアセットベースの広告表示オプション(最大 20 個)にリンクできます。移行方法と、アセットベースの拡張機能へのリンクについては、移行手順をご覧ください。

コール トラッキングに関する考慮事項

CallAssetcall_tracking_enabled フィールドと call_conversion_tracking_disabled フィールドが削除されました。コール トラッキングは CallReportingSetting を使用してアカウント単位で制御されるようになりました。電話番号表示オプションでコンバージョン トラッキングを有効にするには、CallAsset.call_conversion_reporting_state フィールドを使用します。call_conversion_reporting_state は次のいずれかの値に設定できます。

  • DISABLED: 通話コンバージョン アクションは行われません。
  • USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION。つまり、アカウント レベルで設定された通話コンバージョンの種類が広告表示オプションで使用されます。
  • USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION。これは、拡張機能が CallAsset.call_conversion_action フィールドで指定されたコンバージョン アクションを使用することを意味します。その他の call_conversion_reporting_state 値については、CallAsset.call_conversion_action フィールドは無視されます。

フィードベースの電話番号表示オプションを移行する際、call_conversion_tracking_disabledtrue の場合は、新しい CallAsset'call_conversion_reporting_stateDISABLED に設定する必要があります。call_conversion_reporting_state のデフォルト値は USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION です。この拡張機能のコンバージョン トラッキングを引き続き無効にするには、明示的に DISABLED に設定する必要があります。この変更は、2022 年 4 月 8 日以降の自動移行の一部として行われます。

独自のフィードベースの電話番号表示オプションを移行し、パソコンの電話専用広告でコンバージョン トラッキングを使用している場合は、すべての電話番号表示オプションのインスタンスを 1 つのアカウントのアセットベースの広告表示オプションに同時に移行する必要があります。これは、Google 広告専用転送電話番号の割り当てに関するものです。Google 広告専用転送電話番号は、アセットベースの電話番号表示オプションにアカウントのいずれかが設定されている場合にのみ付与されます。

URL で ValueTrack パラメータを使用してアセットベースの広告表示オプションをトラッキングする

アセットベースの広告表示オプションの URL で {feeditemid} を除き、すべての ValueTrack パラメータは引き続き機能します。代わりに、{extensionid} を使って最終ページ URL のトラッキングにリンクしてください。

テンプレート、またはアセットベースの広告表示オプションのカスタム パラメータ。フィードベースの広告表示オプションがアセットベースの広告表示オプションに移行されると、{feeditemid} パラメータは値を返さなくなります。

自動移行の手順では、{feeditemid}{extensionid} に変更されません。{feeditemid} パラメータを使用する URL を更新し、{extensionid} パラメータも含める必要があります。これにより、どちらのタイプの広告表示オプションのクリックも確実にトラッキングできます。ただし、クリックの発生時にデータが入力されるのは、いずれか 1 つのフィールドのみである点に注意してください。

アセットベースの広告表示オプションの配信

アセットベースの広告表示オプションは、さまざまなエンティティへのリンクを含むキャンペーンで配信されるようになります。

AdGroupAsset
この広告グループで広告表示オプションが配信されるようになります。
CampaignAsset
広告表示オプションは、このキャンペーンとそのすべての広告グループで配信されます。
CustomerAsset
広告表示オプションは、対象となるすべてのキャンペーンで配信されます。

これは、従来の動作とは対照的です。

AdGroupFeed
この広告グループで広告表示オプションが配信されるようになります。
CampaignFeed
この広告グループでは、広告グループ フィードへのリンクがある広告グループを除き、広告表示オプションが配信されます。
CustomerFeed
広告表示オプションは、対象となるすべてのキャンペーンまたは広告グループで配信されます。ただし、それぞれ広告表示オプションがキャンパス フィードまたは広告グループ フィードにリンクされている場合、広告表示オプションは配信されません。

つまり、アセットの下位レベルの添付ファイルは過去の上位レベルよりも優先されます。ただし、今後ターゲティングは追加される予定です。

移行手順

フィードベースの広告表示オプションをアセットベースの広告表示オプションに移行するには、次の手順を行います。

  1. 引き続き使用する既存のフィードベースの拡張機能を特定します。
  2. フィードベースの拡張機能のコンテンツを、対応するアセットベースの拡張機能の新しいインスタンスにコピーします。たとえば、Promotion 型の ExtensionFeedItem の内容は、新しい PromotionAsset オブジェクトにコピーされます。
  3. 新しいアセットベースの広告表示オプションを、同じ広告グループとキャンペーンに関連付けます。
  4. アセットベースの拡張機能が正しく設定されていることを確認します。
  5. フィードベースの広告表示オプションをアカウントから削除してください。

フィードベースの広告表示オプションをアセットベースの広告表示オプションにコピーすると、上記のフィード関連のサービスでこの拡張機能を使用した操作はすぐに中止する必要があります。

フィードベースの広告表示オプションは、アセットベースの広告表示オプションに正確にコピーされたことを確認した後、削除する必要があります。

特定の PlaceholderType を使用するフィード アイテムをすべて削除すると、広告表示オプションの種類は完全に移行されます。詳しくは、拡張機能の削除をご覧ください。

次の例では、上記の各ステップをプロモーション表示オプションとともに説明します。

フィードベースの広告表示オプションを特定する

影響を受けるフィード アイテムのリストを取得するには、アカウントで GAQL クエリを実行する必要があります。GAQL クエリについて以下で一般的なケースを説明します。

ネイティブ フィード

アカウントにネイティブ フィード(FeedFeedItemFeedMapping など)がある場合は、次のクエリを使用して、移行する必要があるフィード アイテムを取得します。

まず、目的の広告表示オプション タイプの FeedMapping を持つすべてのフィードを取得します。

SELECT
  feed_mapping.feed,
  feed_mapping.placeholder_type,
  feed_mapping.attribute_field_mappings
FROM feed_mapping
WHERE feed_mapping.placeholder_type IN (
  // Batch 1 extensions (auto-migrating October 2021).
  'CALLOUT',
  'PROMOTION',
  'SITELINK',
  'STRUCTURED_SNIPPET',
  // Batch 2 extensions (auto-migrating April 2022).
  'APP',
  'CALL',
  'PRICE'
)

これで、feed_mapping.feed を使用して目的の FeedItem オブジェクトを取得できるようになります。

SELECT feed_item.attribute_values
FROM feed_item
WHERE feed.resource_name = '<INSERT feed_mapping.feed>'

feed_item.attribute_valuesfeed_mapping.attribute_field_mappings プレースホルダに従って解釈されます。これらのフィールド マッピングでは、拡張フィールドが feed_item.attribute_values にマッピングされていることがわかります。

広告表示オプションの設定サービス

広告表示オプションが広告表示オプション設定サービス(CustomerExtensionSettingServiceCampaignExtensionSettingServiceAdGroupExtensionSettingService など)によって作成された場合、フィード アイテム ID を取得しやすくなります。

Google 広告のクエリ言語の次のクエリを使用して、特定の広告表示オプション タイプの有効な広告表示オプション フィード アイテム ID をリクエストします。

SELECT extension_feed_item.id
FROM extension_feed_item
WHERE extension_feed_item.status = 'ENABLED'
  AND extension_feed_item.extension_type = 'PROMOTION'

返された ID は、拡張機能の詳細情報の取得に使用できます。

フィードベースの広告表示オプションの詳細を取得する

移行するフィードベースの広告表示オプションを特定したら、その ID を別の Google 広告クエリ言語クエリで使用して、その詳細情報をリクエストします。

SELECT
  extension_feed_item.id,
  extension_feed_item.ad_schedules,
  extension_feed_item.device,
  extension_feed_item.status,
  extension_feed_item.start_date_time,
  extension_feed_item.end_date_time,
  extension_feed_item.targeted_campaign,
  extension_feed_item.targeted_ad_group,
  extension_feed_item.promotion_feed_item.discount_modifier,
  extension_feed_item.promotion_feed_item.final_mobile_urls,
  extension_feed_item.promotion_feed_item.final_url_suffix,
  extension_feed_item.promotion_feed_item.final_urls,
  extension_feed_item.promotion_feed_item.language_code,
  extension_feed_item.promotion_feed_item.money_amount_off.amount_micros,
  extension_feed_item.promotion_feed_item.money_amount_off.currency_code,
  extension_feed_item.promotion_feed_item.occasion,
  extension_feed_item.promotion_feed_item.orders_over_amount.amount_micros,
  extension_feed_item.promotion_feed_item.orders_over_amount.currency_code,
  extension_feed_item.promotion_feed_item.percent_off,
  extension_feed_item.promotion_feed_item.promotion_code,
  extension_feed_item.promotion_feed_item.promotion_end_date,
  extension_feed_item.promotion_feed_item.promotion_start_date,
  extension_feed_item.promotion_feed_item.promotion_target,
  extension_feed_item.promotion_feed_item.tracking_url_template
FROM extension_feed_item
WHERE extension_feed_item.extension_type = 'PROMOTION'
  AND extension_feed_item.id = 123456789012
LIMIT 1

返される ExtensionFeedItem には、指定されたフィードベースの拡張機能に現在含まれているすべての値があり、アセットベースの拡張機能に適用できます。

URL カスタム パラメータを使用する場合は、追加の Google 広告クエリ言語クエリを使用して取得する必要があります。前のクエリで取得した ExtensionFeedItem インスタンスに結果を追加します。このクエリ内のフィード アイテム ID は、前のクエリで使用した拡張フィード アイテム ID と同じです。

SELECT feed_item.url_custom_parameters
FROM feed_item
WHERE feed_item.id = 123456789012

アセットベースの広告表示オプションを作成する

前のステップで取得した値を、関連するアセットの新しいインスタンスに適用できます。

Java

private String createPromotionAssetFromFeed(
    GoogleAdsClient googleAdsClient, Long customerId, ExtensionFeedItem extensionFeedItem) {
  PromotionFeedItem promotionFeedItem = extensionFeedItem.getPromotionFeedItem();
  // Creates the Promotion asset.
  Asset.Builder asset =
      Asset.newBuilder()
          .setName("Migrated from feed item " + extensionFeedItem.getId())
          .setTrackingUrlTemplate(promotionFeedItem.getTrackingUrlTemplate())
          .setFinalUrlSuffix(promotionFeedItem.getFinalUrlSuffix())
          .setPromotionAsset(
              PromotionAsset.newBuilder()
                  .setPromotionTarget(promotionFeedItem.getPromotionTarget())
                  .setDiscountModifier(promotionFeedItem.getDiscountModifier())
                  .setRedemptionEndDate(promotionFeedItem.getPromotionStartDate())
                  .setRedemptionEndDate(promotionFeedItem.getPromotionEndDate())
                  .setOccasion(promotionFeedItem.getOccasion())
                  .setLanguageCode(promotionFeedItem.getLanguageCode())
                  .addAllAdScheduleTargets(extensionFeedItem.getAdSchedulesList()))
          .addAllFinalUrls(promotionFeedItem.getFinalUrlsList())
          .addAllFinalMobileUrls(promotionFeedItem.getFinalMobileUrlsList())
          .addAllUrlCustomParameters(promotionFeedItem.getUrlCustomParametersList());

  // Either PercentOff or MoneyAmountOff must be set.
  if (promotionFeedItem.getPercentOff() > 0) {
    // Adjusts the percent off scale when copying.
    asset.getPromotionAssetBuilder().setPercentOff(promotionFeedItem.getPercentOff() / 100);
  } else {
    asset.getPromotionAssetBuilder().setMoneyAmountOff(promotionFeedItem.getMoneyAmountOff());
  }
  // Either PromotionCode or OrdersOverAmount must be set.
  if (promotionFeedItem.getPromotionCode() != null
      && promotionFeedItem.getPromotionCode().length() > 0) {
    asset.getPromotionAssetBuilder().setPromotionCode(promotionFeedItem.getPromotionCode());
  } else {
    asset.getPromotionAssetBuilder().setOrdersOverAmount(promotionFeedItem.getOrdersOverAmount());
  }
  // Sets the start and end dates if set in the existing extension.
  if (extensionFeedItem.hasStartDateTime()) {
    asset.getPromotionAssetBuilder().setStartDate(extensionFeedItem.getStartDateTime());
  }
  if (extensionFeedItem.hasEndDateTime()) {
    asset.getPromotionAssetBuilder().setEndDate(extensionFeedItem.getEndDateTime());
  }
  // Builds an operation to create the Promotion asset.
  AssetOperation operation = AssetOperation.newBuilder().setCreate(asset).build();
  // Gets the Asset Service client.
  try (AssetServiceClient assetServiceClient =
      googleAdsClient.getLatestVersion().createAssetServiceClient()) {
    // Issues the request and returns the resource name of the new Promotion asset.
    MutateAssetsResponse response =
        assetServiceClient.mutateAssets(String.valueOf(customerId), ImmutableList.of(operation));
    String resourceName = response.getResults(0).getResourceName();
    System.out.println("Created Promotion asset with resource name " + resourceName);
    return resourceName;
  }
}
      

C#

private string CreatePromotionAssetFromFeed(GoogleAdsClient client, long customerId,
    ExtensionFeedItem extensionFeedItem)
{
    // Get the Asset Service client.
    AssetServiceClient assetServiceClient = client.GetService(Services.V13.AssetService);

    PromotionFeedItem promotionFeedItem = extensionFeedItem.PromotionFeedItem;

    // Create the Promotion asset.
    Asset asset = new Asset
    {
        // Name field is optional.
        Name = $"Migrated from feed item #{extensionFeedItem.Id}",
        PromotionAsset = new PromotionAsset
        {
            PromotionTarget = promotionFeedItem.PromotionTarget,
            DiscountModifier = promotionFeedItem.DiscountModifier,
            RedemptionStartDate = promotionFeedItem.PromotionStartDate,
            RedemptionEndDate = promotionFeedItem.PromotionEndDate,
            Occasion = promotionFeedItem.Occasion,
            LanguageCode = promotionFeedItem.LanguageCode,
        },
        TrackingUrlTemplate = promotionFeedItem.TrackingUrlTemplate,
        FinalUrlSuffix = promotionFeedItem.FinalUrlSuffix
    };

    // Either PercentOff or MoneyAmountOff must be set.
    if (promotionFeedItem.PercentOff > 0)
    {
        // Adjust the percent off scale when copying.
        asset.PromotionAsset.PercentOff = promotionFeedItem.PercentOff / 100;
    }
    else
    {
        asset.PromotionAsset.MoneyAmountOff = new Money
        {
            AmountMicros = promotionFeedItem.MoneyAmountOff.AmountMicros,
            CurrencyCode = promotionFeedItem.MoneyAmountOff.CurrencyCode
        };
    }

    // Either PromotionCode or OrdersOverAmount must be set.
    if (!string.IsNullOrEmpty(promotionFeedItem.PromotionCode))
    {
        asset.PromotionAsset.PromotionCode = promotionFeedItem.PromotionCode;
    }
    else
    {
        asset.PromotionAsset.OrdersOverAmount = new Money
        {
            AmountMicros = promotionFeedItem.OrdersOverAmount.AmountMicros,
            CurrencyCode = promotionFeedItem.OrdersOverAmount.CurrencyCode
        };
    }

    // Set the start and end dates if set in the existing extension.
    if (extensionFeedItem.HasStartDateTime)
    {
        asset.PromotionAsset.StartDate = DateTime.Parse(extensionFeedItem.StartDateTime)
            .ToString("yyyy-MM-dd");
    }

    if (extensionFeedItem.HasEndDateTime)
    {
        asset.PromotionAsset.EndDate = DateTime.Parse(extensionFeedItem.EndDateTime)
            .ToString("yyyy-MM-dd");
    }

    asset.PromotionAsset.AdScheduleTargets.Add(extensionFeedItem.AdSchedules);
    asset.FinalUrls.Add(promotionFeedItem.FinalUrls);
    asset.FinalMobileUrls.Add(promotionFeedItem.FinalMobileUrls);
    asset.UrlCustomParameters.Add(promotionFeedItem.UrlCustomParameters);

    // Build an operation to create the Promotion asset.
    AssetOperation operation = new AssetOperation
    {
        Create = asset
    };

    // Issue the request and return the resource name of the new Promotion asset.
    MutateAssetsResponse response = assetServiceClient.MutateAssets(
        customerId.ToString(), new[] { operation });
    Console.WriteLine("Created Promotion asset with resource name " +
        $"{response.Results.First().ResourceName}");
    return response.Results.First().ResourceName;
}
      

PHP

private static function createPromotionAssetFromFeed(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    ExtensionFeedItem $extensionFeedItem
): string {
    $promotionFeedItem = $extensionFeedItem->getPromotionFeedItem();
    // Creates the Promotion asset.
    $asset = new Asset([
        // Name field is optional.
        'name' => 'Migrated from feed item #' . $extensionFeedItem->getId(),
        'promotion_asset' => new PromotionAsset([
            'promotion_target' => $promotionFeedItem->getPromotionTarget(),
            'discount_modifier' => $promotionFeedItem->getDiscountModifier(),
            'redemption_start_date' => $promotionFeedItem->getPromotionStartDate(),
            'redemption_end_date' => $promotionFeedItem->getPromotionEndDate(),
            'occasion' => $promotionFeedItem->getOccasion(),
            'language_code' => $promotionFeedItem->getLanguageCode(),
            'ad_schedule_targets' => $extensionFeedItem->getAdSchedules()
        ]),
        'tracking_url_template' => $promotionFeedItem->getTrackingUrlTemplate(),
        'url_custom_parameters' => $promotionFeedItem->getUrlCustomParameters(),
        'final_urls' => $promotionFeedItem->getFinalUrls(),
        'final_mobile_urls' => $promotionFeedItem->getFinalMobileUrls(),
        'final_url_suffix' => $promotionFeedItem->getFinalUrlSuffix(),
    ]);

    // Either percent off or money amount off must be set.
    if ($promotionFeedItem->getPercentOff() > 0) {
        // Adjust the percent off scale when copying.
        $asset->getPromotionAsset()->setPercentOff($promotionFeedItem->getPercentOff() / 100);
    } else {
        $money = new Money([
           'amount_micros' => $promotionFeedItem->getMoneyAmountOff()->getAmountMicros(),
           'currency_code' => $promotionFeedItem->getMoneyAmountOff()->getCurrencyCode()
        ]);
        $asset->getPromotionAsset()->setMoneyAmountOff($money);
    }

    // Either promotion code or orders over amount must be set.
    if (!empty($promotionFeedItem->getPromotionCode())) {
        $asset->getPromotionAsset()->setPromotionCode($promotionFeedItem->getPromotionCode());
    } else {
        $money = new Money([
            'amount_micros' => $promotionFeedItem->getOrdersOverAmount()->getAmountMicros(),
            'currency_code' => $promotionFeedItem->getOrdersOverAmount()->getCurrencyCode()
        ]);
        $asset->getPromotionAsset()->setOrdersOverAmount($money);
    }

    if ($extensionFeedItem->hasStartDateTime()) {
        $startDateTime = new \DateTime($extensionFeedItem->getStartDateTime());
        $asset->getPromotionAsset()->setStartDate($startDateTime->format('yyyy-MM-dd'));
    }
    if ($extensionFeedItem->hasEndDateTime()) {
        $endDateTime = new \DateTime($extensionFeedItem->getEndDateTime());
        $asset->getPromotionAsset()->setEndDate($endDateTime->format('yyyy-MM-dd'));
    }

    // Creates an operation to add the Promotion asset.
    $assetOperation = new AssetOperation();
    $assetOperation->setCreate($asset);

    // Issues a mutate request to add the Promotion asset and prints its information.
    $assetServiceClient = $googleAdsClient->getAssetServiceClient();
    $response = $assetServiceClient->mutateAssets($customerId, [$assetOperation]);
    $assetResourceName = $response->getResults()[0]->getResourceName();
    printf(
        "Created the Promotion asset with resource name: '%s'.%s",
        $assetResourceName,
        PHP_EOL
    );

    return $assetResourceName;
}
      

Python

def create_promotion_asset_from_feed(client, customer_id, extension_feed_item):
    """Retrieves all campaigns associated with the given FeedItem resource name.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: a client customer ID.
        extension_feed_item: an extension feed item.

    Returns:
        the resource name of a newly created promotion asset.
    """
    asset_service = client.get_service("AssetService")
    promotion_feed_item = extension_feed_item.promotion_feed_item

    # Create an asset operation to start building the new promotion asset using
    # data from the given extension feed item.
    asset_operation = client.get_type("AssetOperation")
    asset = asset_operation.create
    asset.name = f"Migrated from feed item ID '{extension_feed_item.id}'"
    asset.tracking_url_template = promotion_feed_item.tracking_url_template
    asset.final_url_suffix = promotion_feed_item.final_url_suffix
    asset.final_urls.extend(promotion_feed_item.final_urls)
    asset.final_mobile_urls.extend(promotion_feed_item.final_mobile_urls)

    promotion_asset = asset.promotion_asset
    promotion_asset.promotion_target = promotion_feed_item.promotion_target
    promotion_asset.discount_modifier = promotion_feed_item.discount_modifier
    promotion_asset.redemption_start_date = (
        promotion_feed_item.promotion_start_date
    )
    promotion_asset.redemption_end_date = promotion_feed_item.promotion_end_date
    promotion_asset.occasion = promotion_feed_item.occasion
    promotion_asset.language_code = promotion_feed_item.language_code
    promotion_asset.ad_schedule_targets.extend(extension_feed_item.ad_schedules)

    # Either percent_off or money_amount_off must be set.
    if promotion_feed_item.percent_off > 0:
        # Adjust the percent off scale after copying. Extension feed items
        # interpret 1,000,000 as 1% and assets interpret 1,000,000 as 100% so
        # to migrate the correct discount value we must divide it by 100.
        promotion_asset.percent_off = int(promotion_feed_item.percent_off / 100)
    else:
        # If percent_off is not set then copy money_amount_off. This field is
        # an instance of Money in both cases, so setting the field with
        # copy_from is possible. Using regular assignment is also valid here.
        client.copy_from(
            promotion_asset.money_amount_off,
            promotion_feed_item.money_amount_off,
        )

    # Check if promotion_code field is set
    if promotion_feed_item.promotion_code:
        promotion_asset.promotion_code = promotion_feed_item.promotion_code
    else:
        # If promotion_code is not set then copy orders_over_amount. This field
        # is an instance of Money in both cases, so setting the field with
        # copy_from is possible. Using regular assignment is also valid here.
        client.copy_from(
            promotion_asset.orders_over_amount,
            promotion_feed_item.orders_over_amount,
        )

    # Set the start and end dates if set in the existing extension.
    if promotion_feed_item.promotion_start_date:
        promotion_asset.start_date = promotion_feed_item.promotion_start_date

    if promotion_feed_item.promotion_end_date:
        promotion_asset.end_date = promotion_feed_item.promotion_end_date

    response = asset_service.mutate_assets(
        customer_id=customer_id, operations=[asset_operation]
    )
    resource_name = response.results[0].resource_name
    print(f"Created promotion asset with resource name: '{resource_name}'")

    return resource_name


      

Ruby

def create_promotion_asset_from_feed(client, customer_id, extension_feed_item)
  # Create a Promotion asset that copies values from the specified extension feed item.

  asset_service = client.service.asset
  promotion_feed_item = extension_feed_item.promotion_feed_item

  # Create an asset operation to start building the new promotion asset using
  # data from the given extension feed item.
  asset_operation = client.operation.create_resource.asset do |asset|
    asset.name = "Migrated from feed item ID '#{extension_feed_item.id}'"
    asset.tracking_url_template = promotion_feed_item.tracking_url_template
    asset.final_url_suffix = promotion_feed_item.final_url_suffix
    asset.final_urls += promotion_feed_item.final_urls
    asset.final_mobile_urls += promotion_feed_item.final_mobile_urls

    # Create the Promotion asset.
    asset.promotion_asset = client.resource.promotion_asset do |pa|
      pa.promotion_target = promotion_feed_item.promotion_target
      pa.discount_modifier = promotion_feed_item.discount_modifier
      pa.redemption_start_date = promotion_feed_item.promotion_start_date
      pa.redemption_end_date = promotion_feed_item.promotion_end_date
      pa.occasion = promotion_feed_item.occasion
      pa.language_code = promotion_feed_item.language_code
      pa.ad_schedule_targets += extension_feed_item.ad_schedules

      # Either percent_off or money_amount_off must be set.
      if promotion_feed_item.percent_off.positive?
        # Adjust the percent off scale after copying.
        pa.percent_off = int(promotion_feed_item.percent_off / 100)
      else
        # If percent_off is not set then copy money_amount_off. This field is
        # an instance of Money in both cases, so setting the field with
        # copy_from is possible. Using regular assignment is also valid here.
        pa.money_amount_off = promotion_feed_item.money_amount_off
      end

      # Either promotion_code or orders_over_amount must be set.
      if promotion_feed_item.promotion_code.empty?
        pa.orders_over_amount = promotion_feed_item.orders_over_amount
      else
        pa.promotion_code = promotion_feed_item.promotion_code
      end

      # Set the start and end dates if set in the existing extension.
      unless promotion_feed_item.promotion_start_date.empty?
        pa.start_date = promotion_feed_item.promotion_start_date
      end

      unless promotion_feed_item.promotion_end_date.empty?
        pa.end_date = promotion_feed_item.promotion_end_date
      end
    end
  end

  response = asset_service.mutate_assets(customer_id: customer_id, operations: [asset_operation])
  resource_name = response.results.first.resource_name
  puts "Created promotion asset with resource name: '#{resource_name}'"

  resource_name
end
      

Perl

sub create_promotion_asset_from_feed {
  my ($api_client, $customer_id, $extension_feed_item) = @_;

  my $promotion_feed_item = $extension_feed_item->{promotionFeedItem};

  # Create the Promotion asset.
  my $asset = Google::Ads::GoogleAds::V13::Resources::Asset->new({
      name => "Migrated from feed item #" . $extension_feed_item->{id},
      trackingUrlTemplate => $promotion_feed_item->{trackingUrlTemplate},
      finalUrlSuffix      => $promotion_feed_item->{finalUrlSuffix},
      promotionAsset      =>
        Google::Ads::GoogleAds::V13::Common::PromotionAsset->new({
          promotionTarget     => $promotion_feed_item->{promotionTarget},
          discountModifier    => $promotion_feed_item->{discountModifier},
          redemptionStartDate => $promotion_feed_item->{promotionStartDate},
          redemptionEndDate   => $promotion_feed_item->{promotionEndDate},
          occasion            => $promotion_feed_item->{occasion},
          languageCode        => $promotion_feed_item->{languageCode}})});

  push @{$asset->{finalUrls}}, @{$promotion_feed_item->{finalUrls}};

  # Copy optional fields if present in the existing extension.
  if (defined($extension_feed_item->{adSchedules})) {
    push @{$asset->{promotionAsset}{adScheduleTargets}},
      @{$extension_feed_item->{adSchedules}};
  }

  if (defined($promotion_feed_item->{finalMobileUrls})) {
    push @{$asset->{finalMobileUrls}},
      @{$promotion_feed_item->{finalMobileUrls}};
  }

  if (defined($promotion_feed_item->{urlCustomParameters})) {
    push @{$asset->{urlCustomParameters}},
      @{$promotion_feed_item->{urlCustomParameters}};
  }

  # Either percentOff or moneyAmountOff must be set.
  if (defined($promotion_feed_item->{percentOff})) {
    # Adjust the percent off scale when copying.
    $asset->{promotionAsset}{percentOff} =
      $promotion_feed_item->{percentOff} / 100;
  } else {
    $asset->{promotionAsset}{moneyAmountOff} =
      Google::Ads::GoogleAds::V13::Common::Money->new({
        amountMicros => $promotion_feed_item->{moneyAmountOff}{amountMicros},
        currencyCode => $promotion_feed_item->{moneyAmountOff}{currencyCode}});
  }

  # Either promotionCode or ordersOverAmount must be set.
  if (defined($promotion_feed_item->{promotionCode})) {
    $asset->{promotionAsset}{promotionCode} =
      $promotion_feed_item->{promotionCode};
  } else {
    $asset->{promotionAsset}{ordersOverAmount} =
      Google::Ads::GoogleAds::V13::Common::Money->new({
        amountMicros => $promotion_feed_item->{ordersOverAmount}{amountMicros},
        currencyCode => $promotion_feed_item->{ordersOverAmount}{currencyCode}}
      );
  }

  # Set the start and end dates if set in the existing extension.
  if (defined($extension_feed_item->{startDateTime})) {
    $asset->{promotionAsset}{startDate} =
      substr($extension_feed_item->{startDateTime},
      0, index($extension_feed_item->{startDateTime}, ' '));
  }

  if (defined($extension_feed_item->{endDateTime})) {
    $asset->{promotionAsset}{endDate} =
      substr($extension_feed_item->{endDateTime},
      0, index($extension_feed_item->{endDateTime}, ' '));
  }

  # Build an operation to create the Promotion asset.
  my $operation =
    Google::Ads::GoogleAds::V13::Services::AssetService::AssetOperation->new({
      create => $asset
    });

  # Issue the request and return the resource name of the new Promotion asset.
  my $response = $api_client->AssetService()->mutate({
      customerId => $customer_id,
      operations => [$operation]});

  printf
    "Created Promotion asset with resource name '%s'.\n",
    $response->{results}[0]{resourceName};

  return $response->{results}[0]{resourceName};
}
      

アセットをキャンペーンと広告グループに関連付ける

これで、新しいアセットを元のフィードベースの広告表示オプションと同じ顧客、キャンペーン、広告グループに関連付けることができるようになりました。まず、拡張機能の設定に現在関連付けられているリソース ID を取得します。

Java

private List<Long> getTargetedCampaignIds(
    GoogleAdsServiceClient client, Long customerId, String extensionFeedItemResourceName) {
  String query =
      "SELECT campaign.id, campaign_extension_setting.extension_feed_items "
          + "FROM campaign_extension_setting "
          + "WHERE campaign_extension_setting.extension_type = 'PROMOTION' "
          + "  AND campaign.status != 'REMOVED'";
  ServerStream<SearchGoogleAdsStreamResponse> serverStream =
      client
          .searchStreamCallable()
          .call(
              SearchGoogleAdsStreamRequest.newBuilder()
                  .setCustomerId(String.valueOf(customerId))
                  .setQuery(query)
                  .build());
  List<Long> campaignIds = new ArrayList<>();
  for (SearchGoogleAdsStreamResponse response : serverStream) {
    for (GoogleAdsRow row : response.getResultsList()) {
      Campaign campaign = row.getCampaign();
      CampaignExtensionSetting extensionSetting = row.getCampaignExtensionSetting();
      // Adds the campaign ID to the list of IDs if the extension feed item is
      // associated with this extension setting.
      if (extensionSetting.getExtensionFeedItemsList().contains(extensionFeedItemResourceName)) {
        campaignIds.add(campaign.getId());
        System.out.println("Found matching campaign with ID " + campaign.getId());
      }
    }
  }
  return campaignIds;
}
      

C#

private List<long> GetTargetedCampaignIds(GoogleAdsServiceClient googleAdsServiceClient,
    long customerId, string extensionFeedResourceName)
{
    List<long> campaignIds = new List<long>();

    string query = @"
        SELECT campaign.id, campaign_extension_setting.extension_feed_items
        FROM campaign_extension_setting
        WHERE campaign_extension_setting.extension_type = 'PROMOTION'
          AND campaign.status != 'REMOVED'";

    googleAdsServiceClient.SearchStream(customerId.ToString(), query,
        delegate (SearchGoogleAdsStreamResponse response)
        {
            foreach (GoogleAdsRow googleAdsRow in response.Results)
            {
                // Add the campaign ID to the list of IDs if the extension feed item is
                // associated with this extension setting.
                if (googleAdsRow.CampaignExtensionSetting.ExtensionFeedItems.Contains(
                    extensionFeedResourceName))
                {
                    Console.WriteLine(
                        $"Found matching campaign with ID {googleAdsRow.Campaign.Id}.");
                    campaignIds.Add(googleAdsRow.Campaign.Id);
                }
            }
        }
    );

    return campaignIds;
}
      

PHP

private static function getTargetedCampaignIds(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $extensionFeedItemResourceName
): array {
    $campaignIds = [];
    $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
    // Create a query that will retrieve the campaign extension settings.
    $query = "SELECT campaign.id, campaign_extension_setting.extension_feed_items "
        . "FROM campaign_extension_setting "
        . "WHERE campaign_extension_setting.extension_type = 'PROMOTION' "
        . "AND campaign.status != 'REMOVED'";

    // Issue a search request to get the campaign extension settings.
    /** @var GoogleAdsServerStreamDecorator $stream */
    $stream = $googleAdsServiceClient->searchStream($customerId, $query);
    foreach ($stream->iterateAllElements() as $googleAdsRow) {
        /** @var GoogleAdsRow $googleAdsRow */
        // Add the campaign ID to the list of IDs if the extension feed item is
        // associated with this extension setting.
        if (
            in_array(
                $extensionFeedItemResourceName,
                iterator_to_array(
                    $googleAdsRow->getCampaignExtensionSetting()->getExtensionFeedItems()
                )
            )
        ) {
            printf(
                "Found matching campaign with ID %d.%s",
                $googleAdsRow->getCampaign()->getId(),
                PHP_EOL
            );
            $campaignIds[] = $googleAdsRow->getCampaign()->getId();
        }
    }
    return $campaignIds;
}
      

Python

def get_targeted_campaign_ids(client, customer_id, resource_name):
    """Retrieves all campaigns associated with the given FeedItem resource name.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: a client customer ID.
        resource_name: an extension feed item resource name.

    Returns:
        a list of campaign IDs.
    """
    ga_service = client.get_service("GoogleAdsService")

    query = """
      SELECT
        campaign.id,
        campaign_extension_setting.extension_feed_items
      FROM campaign_extension_setting
      WHERE
        campaign_extension_setting.extension_type = 'PROMOTION'
        AND campaign.status != 'REMOVED'"""

    stream = ga_service.search_stream(customer_id=customer_id, query=query)

    campaign_ids = []

    for batch in stream:
        for row in batch.results:
            feed_items = row.campaign_extension_setting.extension_feed_items
            if resource_name in feed_items:
                print(f"Found matching campaign with ID: '{row.campaign.id}'")
                campaign_ids.append(row.campaign.id)

    return campaign_ids


      

Ruby

def get_targeted_campaign_ids(client, customer_id, resource_name)
  # Finds and returns all of the campaigns that are associated with the specified
  # Promotion extension feed item.

  query = <<~QUERY
    SELECT
      campaign.id,
      campaign_extension_setting.extension_feed_items
    FROM campaign_extension_setting
    WHERE
      campaign_extension_setting.extension_type = 'PROMOTION'
      AND campaign.status != 'REMOVED'
  QUERY

  responses = client.service.google_ads.search_stream(customer_id: customer_id, query: query)

  campaign_ids = []

  responses.each do |response|
    response.results.each do |row|
      feed_items = row.campaign_extension_setting.extension_feed_items
      if feed_items.include?(resource_name)
        puts "Found matching campaign with ID '#{row.campaign.id}'."
        campaign_ids << row.campaign.id
      end
    end
  end

  campaign_ids
end
      

Perl

sub get_targeted_campaign_ids {
  my ($google_ads_service, $customer_id, $extension_feed_item_resource_name) =
    @_;

  my @campaign_ids;

  my $query = "
        SELECT campaign.id, campaign_extension_setting.extension_feed_items
        FROM campaign_extension_setting
        WHERE campaign_extension_setting.extension_type = 'PROMOTION'
          AND campaign.status != 'REMOVED'";

  my $search_stream_request =
    Google::Ads::GoogleAds::V13::Services::GoogleAdsService::SearchGoogleAdsStreamRequest
    ->new({
      customerId => $customer_id,
      query      => $query
    });

  my $search_stream_handler =
    Google::Ads::GoogleAds::Utils::SearchStreamHandler->new({
      service => $google_ads_service,
      request => $search_stream_request
    });

  $search_stream_handler->process_contents(
    sub {
      my $google_ads_row = shift;

      # Add the campaign ID to the list of IDs if the extension feed item
      # is associated with this extension setting.
      if (grep { $_ eq $extension_feed_item_resource_name }
        @{$google_ads_row->{campaignExtensionSetting}{extensionFeedItems}})
      {
        printf
          "Found matching campaign with ID $google_ads_row->{campaign}{id}.\n";
        push @campaign_ids, $google_ads_row->{campaign}{id};
      }
    });

  return @campaign_ids;
}
      

次に、新しい CampaignAssetAdGroupAssetCustomerAsset を作成してアップロードし、アセットを各リソースにリンクします。

Java

private void associateAssetWithCampaigns(
    GoogleAdsClient googleAdsClient,
    Long customerId,
    String promotionAssetResourceName,
    List<Long> campaignIds) {
  if (campaignIds.isEmpty()) {
    System.out.println("Asset was not associated with any campaigns.");
    return;
  }

  // Constructs an operation to associate the asset with each campaign.
  List<CampaignAssetOperation> campaignAssetOperations =
      campaignIds.stream()
          .map(
              id ->
                  CampaignAssetOperation.newBuilder()
                      .setCreate(
                          CampaignAsset.newBuilder()
                              .setAsset(promotionAssetResourceName)
                              .setFieldType(AssetFieldType.PROMOTION)
                              .setCampaign(ResourceNames.campaign(customerId, id)))
                      .build())
          .collect(Collectors.toList());

  // Creates a service client.
  try (CampaignAssetServiceClient campaignAssetServiceClient =
      googleAdsClient.getLatestVersion().createCampaignAssetServiceClient()) {
    // Issues the mutate request.
    MutateCampaignAssetsResponse response =
        campaignAssetServiceClient.mutateCampaignAssets(
            String.valueOf(customerId), campaignAssetOperations);
    // Prints some information about the result.
    for (MutateCampaignAssetResult result : response.getResultsList()) {
      System.out.println("Created campaign asset with resource name " + result.getResourceName());
    }
  }
}
      

C#

private void AssociateAssetWithCampaigns(GoogleAdsClient client, long customerId,
    string promotionAssetResourceName, List<long> campaignIds)
{
    if (campaignIds.Count == 0)
    {
        Console.WriteLine("Asset was not associated with any campaigns.");
        return;
    }

    CampaignAssetServiceClient campaignAssetServiceClient = client.GetService(Services.V13
        .CampaignAssetService);

    List<CampaignAssetOperation> operations = new List<CampaignAssetOperation>();

    foreach (long campaignId in campaignIds)
    {
        operations.Add(new CampaignAssetOperation
        {
            Create = new CampaignAsset
            {
                Asset = promotionAssetResourceName,
                FieldType = AssetFieldTypeEnum.Types.AssetFieldType.Promotion,
                Campaign = ResourceNames.Campaign(customerId, campaignId),
            }
        });
    }

    MutateCampaignAssetsResponse response = campaignAssetServiceClient.MutateCampaignAssets(
        customerId.ToString(), operations);

    foreach (MutateCampaignAssetResult result in response.Results)
    {
        Console.WriteLine($"Created campaign asset with resource name " +
            $"{result.ResourceName}.");
    }
}
      

PHP

private static function associateAssetWithCampaigns(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $promotionAssetResourceName,
    array $campaignIds
) {
    if (empty($campaignIds)) {
        print 'Asset was not associated with any campaigns.' . PHP_EOL;
        return;
    }
    $operations = [];
    foreach ($campaignIds as $campaignId) {
        $operations[] = new CampaignAssetOperation([
            'create' => new CampaignAsset([
                'asset' => $promotionAssetResourceName,
                'field_type' => AssetFieldType::PROMOTION,
                'campaign' => ResourceNames::forCampaign($customerId, $campaignId)
            ])
        ]);
    }
    // Issues a mutate request to add the campaign assets and prints their information.
    $campaignAssetServiceClient = $googleAdsClient->getCampaignAssetServiceClient();
    $response = $campaignAssetServiceClient->mutateCampaignAssets($customerId, $operations);
    foreach ($response->getResults() as $addedCampaignAsset) {
        /** @var CampaignAsset $addedCampaignAsset */
        printf(
            "Created campaign asset with resource name: '%s'.%s",
            $addedCampaignAsset->getResourceName(),
            PHP_EOL
        );
    }
}
      

Python

def associate_asset_with_campaigns(
    client, customer_id, promotion_asset_resource_name, campaign_ids
):
    """Associates the specified promotion asset with the specified campaigns.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: a client customer ID.
        promotion_asset_resource_name: the resource name for a promotion asset.
        campaign_ids: a list of campaign IDs.
    """
    if len(campaign_ids) == 0:
        print(f"Asset was not associated with any campaigns.")
        return

    campaign_service = client.get_service("CampaignService")
    campaign_asset_service = client.get_service("CampaignAssetService")

    operations = []

    for campaign_id in campaign_ids:
        operation = client.get_type("CampaignAssetOperation")
        campaign_asset = operation.create
        campaign_asset.asset = promotion_asset_resource_name
        campaign_asset.field_type = client.enums.AssetFieldTypeEnum.PROMOTION
        campaign_asset.campaign = campaign_service.campaign_path(
            customer_id, campaign_id
        )
        operations.append(operation)

    response = campaign_asset_service.mutate_campaign_assets(
        customer_id=customer_id, operations=operations
    )

    for result in response.results:
        print(
            "Created campaign asset with resource name: "
            f"'{result.resource_name}'"
        )


      

Ruby

def associate_asset_with_campaigns(client, customer_id, promotion_asset_resource_name, campaign_ids)
  # Associates the specified promotion asset with the specified campaigns.

  if campaign_ids.empty?
    puts 'Asset was not associated with any campaigns.'
    return
  end

  operations = campaign_ids.map do |campaign_id|
    client.operation.create_resource.campaign_asset do |ca|
      ca.asset = promotion_asset_resource_name
      ca.field_type = :PROMOTION
      ca.campaign = client.path.campaign(customer_id, campaign_id)
    end
  end

  response = client.service.campaign_asset.mutate_campaign_assets(
    customer_id: customer_id,
    operations: operations,
  )

  response.results.each do |result|
    puts "Created campaign asset with resource name '#{result.resource_name}'."
  end
end
      

Perl

sub associate_asset_with_campaigns {
  my ($api_client, $customer_id, $promotion_asset_resource_name, @campaign_ids)
    = @_;

  if (scalar(@campaign_ids) == 0) {
    printf "Asset was not associated with any campaigns.\n";
    return ();
  }

  my $operations = [];

  foreach my $campaign_id (@campaign_ids) {
    my $campaign_asset =
      Google::Ads::GoogleAds::V13::Resources::CampaignAsset->new({
        asset     => $promotion_asset_resource_name,
        fieldType => PROMOTION,
        campaign => Google::Ads::GoogleAds::V13::Utils::ResourceNames::campaign(
          $customer_id, $campaign_id
        )});

    my $operation =
      Google::Ads::GoogleAds::V13::Services::CampaignAssetService::CampaignAssetOperation
      ->new({
        create => $campaign_asset
      });

    push @$operations, $operation;
  }

  my $response = $api_client->CampaignAssetService()->mutate({
    customerId => $customer_id,
    operations => $operations
  });

  foreach my $result (@{$response->{results}}) {
    printf "Created campaign asset with resource name '%s'.\n",
      $result->{resourceName};
  }
}
      

アセットの内容を確認する

プロモーション アセットのコンテンツを取得するには、次の Google 広告クエリ言語クエリを使用します。 結果を検査して、すべての関連フィールドが正しくコピーされていることを確認します。

この時点で 2 つの同じ広告表示オプションは両方ともアクティブですが、フィードベースの広告表示オプションではなくアセットベースの広告表示オプションが配信されます。

SELECT
  asset.id,
  asset.name,
  asset.type,
  asset.final_urls,
  asset.final_mobile_urls,
  asset.final_url_suffix,
  asset.tracking_url_template,
  asset.promotion_asset.promotion_target,
  asset.promotion_asset.discount_modifier,
  asset.promotion_asset.redemption_start_date,
  asset.promotion_asset.redemption_end_date,
  asset.promotion_asset.occasion,
  asset.promotion_asset.language_code,
  asset.promotion_asset.percent_off,
  asset.promotion_asset.money_amount_off.amount_micros,
  asset.promotion_asset.money_amount_off.currency_code,
  asset.promotion_asset.promotion_code,
  asset.promotion_asset.orders_over_amount.amount_micros,
  asset.promotion_asset.orders_over_amount.currency_code,
  asset.promotion_asset.start_date,
  asset.promotion_asset.end_date,
  asset.promotion_asset.ad_schedule_targets
FROM asset
WHERE asset.resource_name = 'customers/123456789/assets/123456789012'

フィードベースの広告表示オプションを削除する

アセットベースの広告表示オプションが元のフィードベースの広告表示オプションを正確に反映していることを確認したら、フィードベースの広告表示オプションを削除します。

既存のフィードベースの広告表示オプションはすべて、自動移行日に自動的に移行されます。同じ拡張機能が複数回発生しないように、移行後にフィードベースの拡張機能を削除します。

自動的に移行されたアカウントの検出

すでに移行されたアカウントの拡張機能を変更しようとすると、API は FeedErrorEnum.FeedError.legacy_extension_type_read_only を返します。このようなアカウントは、フィード サービスのいずれか(FeedItemService など)に対して小規模な変更オペレーションを作成することで検出できます。

結果を適用せずに確認するだけの場合は、リクエストの validate_only フィールドを設定します。レスポンスにはアカウントが自動移行されたかどうかが表示されます。

移行は段階的に行われるため、一部の拡張機能が移行され、他の拡張機能は移行されない可能性があります。具体的なタイミングについては、上記の移行スケジュールのガイダンスをご覧ください。

使用可能なフィード レポート

過去のフィード レポートは、2022 年 8 月まで引き続きご利用いただけます。 フィードベースの広告表示オプションでは、移行後に新しいデータは生成されなくなります。

アセットの内容をリクエストするには、Google 広告クエリ言語クエリを asset レポートに送信します。このレポートタイプはフィードベースの広告表示オプションの extension_feed_item レポートタイプに似ています。

アセットベースの広告表示オプションのパフォーマンス統計情報は、asset_field_type_view レポートに Google 広告クエリ言語クエリを発行することでリクエストできます。このレポートタイプはフィードベースの広告表示オプションの feed_placeholder_view レポートタイプに似ています。

よくある質問(FAQ)

アセットで完全にサポートされていない以前の広告表示オプションはどうなりますか?

サポートされていないフィールドなしでアセットが作成されます。たとえば、デバイス設定ではアセットを使用できなくなりました。デバイス設定を含む拡張機能は、デバイス設定なしでアセットに移行されます。

広告ポリシー審査に合格していない従来の広告表示オプションはどうなりますか?

不承認のステータスの広告表示オプションは移行を試みますが、場合によっては失敗することもあります。

ポリシー審査が同期的に不承認となった場合、アセットは移行されません。ポリシー違反のほとんどは、このバケットに該当します(長すぎるテキスト、わいせつな表現など)。

それ以外の場合は、非同期で行われる詳細なポリシー承認の場合、拡張機能を移行しますが、移行後に不承認となることがあります。

以前の広告表示オプションのレポート指標

アセットへの移行後に指標がリセットされます。従来の指標は、移行後すぐには利用できますが、ある時点で削除される予定です。

1 種類のアセット表示オプション(コールアウトなど)を追加しても、フィードなどから配信できる他のタイプの広告表示オプション(価格など)は引き続き使用できますか。

はい。このリンクは、リンクされている広告表示オプションの種類に対してのみアップグレードされます。特定のタイプのアセット広告表示オプションをリンクしていない場合、フィードベースの広告表示オプションはそのタイプに対して引き続き配信されます。

同様に、特定の種類の広告表示オプションをリンクすると、そのタイプの広告表示オプションはフィードの対象でなくなります。

同じキャンペーン内でフィードとアセットを組み合わせることもできます。ある広告グループにアセットがリンクされていて、別の広告グループにフィードがリンクされている場合は、どちらも配信対象となります。

フィード アイテムは Google の自動移行によって削除されますか?

いいえ。フィード アイテムのリンク(CampaignFeed など)は削除されますが、元のフィード アイテムは削除されません。

Google の自動移行で配信フィード アイテムのみが移行されますか?

いいえ。フィード アイテム リンク(CampaignFeed など)を介してフィード アイテムがアクティブに提供されているかどうかにかかわらず、すべてのフィード アイテムはアセットに移行されます。