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

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

たとえば AdWords でレストランの広告を掲載している場合に、すでに設定している AdWords キャンペーンに、お客様のビジネスに関する次のような情報を追加するとします。

  • 店舗の営業時間: ユーザーがこのリンクをクリックすると http://www.example.com/storehours が表示されます。
  • 栄養に関するデータ: ユーザーがこのリンクをクリックすると http://www.example.com/menu/nutritiondata が表示され、各メニューの栄養情報が表示されます。
  • サービスタイム: ユーザーがこのリンクをクリックすると http://www.example.com/happyhours が表示されますが、これは月曜~金曜の午後 6 時~午後 9 時および土曜の午後 5 時~午後 8 時の時間帯にのみ表示されます。
  • 感謝祭メニュー: 11 月 27 日~28 日に予定されている感謝祭の特別メニューに関連するリンクで、11 月 20 日~27 日の期間にのみ表示され、 ユーザーが http://www.example.com/thanksgiving で予約できるようにします。

上記の各項目は、AdWords の広告表示オプションです。広告表示オプションは、 AdWords API の広告表示オプション設定サービスで管理できます。

広告表示オプションの追加

広告表示オプションには複数の種類が用意されており、アカウント、キャンペーン、広告グループの各単位で追加できます。 ただし、すべての単位で広告表示オプションの全種類を使用できるわけではありません。新しい広告表示オプションの場合は、 演算子 ADD または SET を使います。広告表示オプションが使用されていない状況で SET 演算子を使用すると、新しい広告表示オプションが追加されます。広告表示オプションには次の種類があります。

サイトリンクを使用して、メインのランディング ページ以外にも、サイト内の特定のサブページにリンクすることができます。これにより、ユーザーが目的のページを簡単に見つけられるようになります。

次のコード スニペットは、CampaignExtensionSettingService を使って、新しい広告表示オプションをキャンペーンに追加する方法を示しています。

// Get the CampaignExtensionSettingService.
CampaignExtensionSettingService campaignExtensionSettingService =
    (CampaignExtensionSettingService) user.GetService(
         AdWordsService.v201705.CampaignExtensionSettingService);

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;
campaignExtensionSetting.extensionType = FeedType.SITELINK;

SitelinkFeedItem link1 = new SitelinkFeedItem() {
    sitelinkText = "Store Hours",
    sitelinkUrl = "http://www.example.com/storehours"
};

SitelinkFeedItem link2 = new SitelinkFeedItem() {
    sitelinkText = "Thanksgiving Specials",
    sitelinkUrl = "http://www.example.com/thanksgiving",
    startTime = "20141120 000000 EST",
    endTime = "20141127 235959 EST",

    // Target this sitelink for United States only. See
    // https://developers.google.com/adwords/api/docs/appendix/geotargeting
    // for valid geolocation codes.
    geoTargeting = new Location () {
      id = 2840
    };
};

SitelinkFeedItem link3 = new SitelinkFeedItem() {
    sitelinkText = "Nutrition Data",
    sitelinkUrl = "http://www.example.com/menu/nutritiondata"
};

SitelinkFeedItem link4 = new SitelinkFeedItem() {
    sitelinkText = "Happy hours",
    sitelinkUrl = "http://www.example.com/happyhours",
    scheduling = new FeedItemSchedule[] {
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.MONDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.TUESDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.WEDNESDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.THURSDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.FRIDAY,
            startHour = 18,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        },
        new FeedItemSchedule() {
            dayOfWeek = AdWords.v201705.DayOfWeek.SATURDAY,
            startHour = 17,
            startMinute = MinuteOfHour.ZERO,
            endHour = 21,
            endMinute = MinuteOfHour.ZERO
        }
    }
};

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] {
        link1, link2, link3, link4
    },
};

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
    operand = campaignExtensionSetting,
    @operator = Operator.ADD,
};

CampaignExtensionSettingReturnValue retVal = campaignExtensionSettingService.mutate(
    new CampaignExtensionSettingOperation[] {operation});

電話番号表示オプション

CallFeedItem 表示オプションを使うと、広告と一緒にビジネスの電話番号が 表示され、ユーザーが広告から直接電話をかけることができます。次のコード スニペットは、 その方法を示しています。

CallFeedItem callFeedItem = new CallFeedItem() {
    callCountryCode = "US",
    callPhoneNumber = "212-565-0000",
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { callFeedItem },
};

レビュー表示オプション

レビュー表示オプションを使うと、広告と一緒にビジネスのレビューが表示されます。次の コード スニペットは、レビュー表示オプションを作成する方法を示しています。

ReviewFeedItem reviewFeeditem = new ReviewFeedItem() {
    reviewSourceName = "Example Food review magazine",
    reviewSourceUrl =
        "http://www.example.com/reviews/2014/03/the-amazing-example-hotel",
    reviewText = "The best food in New York city!",
    reviewTextExactlyQuoted = true
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { reviewFeeditem },
};

コールアウト表示オプション

コールアウト表示オプションを使うと、検索広告のすぐ下にテキストで 追加情報(提供している商品やサービス)を表示できます。次の コード スニペットは、コールアウト表示オプションを作成する方法を示しています。

CalloutFeedItem freeDeliveryCallout = new CalloutFeedItem() {
   calloutText = "Free delivery",
};
CalloutFeedItem kidsCallout = new CalloutFeedItem() {
   calloutText = "Kids eat free",
};

CampaignExtensionSetting campaignExtensionSetting = new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;
campaignExtensionSetting.extensionType = FeedType.CALLOUT;
campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] {
        freeDeliveryCallout, kidsCallout
    }
};

アプリリンク表示オプション

モバイル ユーザーをターゲットとするため Android または iOS アプリを開発している場合、 アプリリンク表示オプションを使うと、広告と一緒にアプリへのリンクを表示 できます。アプリリンク表示オプションが表示されるのは、Google にログイン中で、 対象のアプリをまだインストールしていないユーザーに限られます。アプリリンク表示オプションのリンクを クリックしたユーザーには、アプリの Google Play または Apple iTunes が表示されます。このコード スニペットは、Google Play アプリのアプリリンク表示オプションを作成する方法を示しています。

AppFeedItem appFeedItem = new AppFeedItem() {
    appId = "com.example.mobileapp",
    appStore = AppFeedItemAppStore.GOOGLE_PLAY,
    appLinkText = "Install our mobile app!",
    appUrl = "https://play.google.com/store/apps/details?id=com.example.mobileapp"
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { appFeedItem },
};

メッセージ表示オプション

メッセージ表示オプション付きの広告では、ユーザーは広告内のアイコンをクリックすることで、広告主様に直接テキスト メッセージを送ることができます。予約申し込み、見積もり依頼、資料請求など、さまざまな内容を、タップひとつで送信してもらうことが可能です。次のコード スニペットは、MessageFeedItem を使って、メッセージ表示オプションを設定する方法を示しています。

MessageFeedItem messageFeedItem = new MessageFeedItem() {
    messageBusinessName = "Travel Here",
    messageCountryCode = "US",
    messagePhoneNumber = "212-565-0000",
    messageText = "I want to know more.",
    messageExtensionText = "Ask us about travel.",
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { messageFeedItem },
};

価格表示オプション

価格表示オプションは、商品やサービスの詳細や価格を比較表示できる広告表示オプションです。サービス、商品、イベントなどのアイテムの一覧と、ユーザーに表示する価格の一覧を入力できます。

他の広告表示オプションと同様にカスタマイズとターゲット設定に対応しており、3~8 個の商品やサービスについての見出し、説明情報、価格の詳細を表示できます。

価格表示オプションは、アカウント、キャンペーン、広告グループ単位で追加できます。

次のコード スニペットは、価格表示オプションを作成する方法を示しています。

// Create the price extension feed item.
PriceFeedItem priceFeedItem = new PriceFeedItem();
priceFeedItem.setPriceExtensionType(PriceExtensionType.SERVICES);

// Price qualifier is optional.
priceFeedItem.setPriceQualifier(PriceExtensionPriceQualifier.FROM);
priceFeedItem.setTrackingUrlTemplate("http://tracker.example.com/?u={lpurl}");
priceFeedItem.setLanguage("en");
FeedItemCampaignTargeting campaignTargeting = new FeedItemCampaignTargeting();
campaignTargeting.setTargetingCampaignId(campaignId);
priceFeedItem.setCampaignTargeting(campaignTargeting);
priceFeedItem.setScheduling(
    new FeedItemScheduling(
        new FeedItemSchedule[] {
          new FeedItemSchedule(DayOfWeek.SUNDAY, 10, MinuteOfHour.ZERO, 18, MinuteOfHour.ZERO),
          new FeedItemSchedule(DayOfWeek.SATURDAY, 10, MinuteOfHour.ZERO, 22, MinuteOfHour.ZERO)
        }));

// To create a price extension, at least three table rows are needed.
List<PriceTableRow> priceTableRows = new ArrayList<>();
String currencyCode = "USD";
priceTableRows.add(
    createPriceTableRow(
        "Scrubs",
        "Body Scrub, Salt Scrub",
        "http://www.example.com/scrubs",
        "http://m.example.com/scrubs",
        60000000,
        currencyCode,
        PriceExtensionPriceUnit.PER_HOUR));
priceTableRows.add(
    createPriceTableRow(
        "Hair Cuts",
        "Once a month",
        "http://www.example.com/haircuts",
        "http://m.example.com/haircuts",
        75000000,
        currencyCode,
        PriceExtensionPriceUnit.PER_MONTH));
priceTableRows.add(
    createPriceTableRow(
        "Skin Care Package",
        "Four times a month",
        "http://www.example.com/skincarepackage",
        null,
        250000000,
        currencyCode,
        PriceExtensionPriceUnit.PER_MONTH));
priceFeedItem.setTableRows(priceTableRows.toArray(new PriceTableRow[priceTableRows.size()]));

// Create your campaign extension settings. This associates the sitelinks
// to your campaign.
CustomerExtensionSetting customerExtensionSetting = new CustomerExtensionSetting();
customerExtensionSetting.setExtensionType(FeedType.PRICE);
ExtensionSetting extensionSetting = new ExtensionSetting();
extensionSetting.setExtensions(new ExtensionFeedItem[] {priceFeedItem});
customerExtensionSetting.setExtensionSetting(extensionSetting);

createPriceTableRow への参照は次のように指定します。

/**
 * Creates a new {@link PriceTableRow} with the specified attributes.
 *
 * @param header the header for the row
 * @param description the description for the row
 * @param finalUrl the final URL for the row
 * @param finalMobileUrl the final mobile URL for the row, or null if this field should not be set
 * @param priceInMicros the price for the row, in micros
 * @param currencyCode the currency for the row
 * @param priceUnit the price unit for the row
 * @return a new {@link PriceTableRow}
 */
private static PriceTableRow createPriceTableRow(
    String header,
    String description,
    String finalUrl,
    String finalMobileUrl,
    long priceInMicros,
    String currencyCode,
    PriceExtensionPriceUnit priceUnit) {
  PriceTableRow priceTableRow = new PriceTableRow();
  priceTableRow.setHeader(header);
  priceTableRow.setDescription(description);

  UrlList finalUrls = new UrlList();
  finalUrls.setUrls(new String[] {finalUrl});
  priceTableRow.setFinalUrls(finalUrls);

  if (finalMobileUrl != null) {
    UrlList finalMobileUrls = new UrlList();
    finalMobileUrls.setUrls(new String[] {finalMobileUrl});
    priceTableRow.setFinalMobileUrls(finalMobileUrls);
  }

  MoneyWithCurrency price = new MoneyWithCurrency();
  Money priceMoney = new Money();
  price.setCurrencyCode(currencyCode);
  priceMoney.setMicroAmount(priceInMicros);
  price.setMoney(priceMoney);
  priceTableRow.setPrice(price);
  priceTableRow.setPriceUnit(priceUnit);

  return priceTableRow;
}

プロモーション表示オプション

プロモーション表示オプションを使って、セールなどのプロモーションをアピールし、今すぐ購入することでどれほど節約できるかをユーザーに示すことができます。表示オプションの表示内容を詳しくカスタマイズするために、多くのフィールドが用意されています。そのうち、以下のフィールドは必須フィールドです。

  • promotionTarget - 表示オプションが表示されたときに、広告に表示されるテキストです。
  • percentOff または moneyAmountOff - これらのうちいずれかが必須です。ユーザーに割引の大きさを示します。

    • percentOff は、マイクロ単位で設定します。100 万マイクロは 1% を表し、実際に表示される際には、パーセント値として表示されます。たとえば値が 10000000 の場合、実際には「10%」と表示されます。
    • moneyAmountOff もマイクロ単位で、通貨と金額の両方を設定します。
  • finalUrls - 広告表示オプションをクリックした際に表示されるランディング ページの URL ターゲットです。

省略可能なフィールド:

  • occasion - たとえば、NEW_YEARSHALLOWEEN

    • 広告表示オプション設定サービスを使わずに occasion を使用する場合は、PromotionFeedItem で記載されている列挙型の値と完全に一致する値を設定してください。
  • discountModifier - プロモーション率が変数の場合に、プロモーションに「最大」などの言い回しを追加することができます。

    • 広告表示オプション設定サービスを使用せずに discountModifier を使用する場合は、PromotionFeedItem で記載されている列挙型の値と完全に一致する値を設定してください。
  • promotionCode - ユーザーが割引を取得するために入力するものです。

  • ordersOverAmount - ユーザーがプロモーションの対象となるための最低金額を指定します。

    • PromotionFeedItem ごとに promotionCodeordersOverAmount を 1 つのみ指定することができます。
  • promotionStartpromotionEnd - プロモーション期間中のみ広告表示オプションが表示されるようにします。プロモーションの開始時間と終了時間は、datetime フォーマットで設定します。時刻は午前 0 時のみが許可されています。たとえば、6 月限定のプロモーションの場合、promotionStart を「20170601 000000」に、promotionEnd を「20170701 000000」に設定します。

    • 「00000101 000000」という特別な値を設定することにより、これらのフィールドをクリアすることができます。

残りのフィールドについて詳しくは、PromotionFeedItem のページをご覧ください。

以下のコード スニペットは、プロモーション表示オプションを作成する方法を示しています。

PromotionFeedItem promotionFeedItem = new PromotionFeedItem() {
    promotionTarget = "Wool Socks",
    percentOff = 10000000,
    promotionCode = "WinterSocksDeal",
    finalUrls = new string[] { "http://www.example.com/socks" },
};

CampaignExtensionSetting campaignExtensionSetting =
    new CampaignExtensionSetting();
campaignExtensionSetting.campaignId = campaignId;

campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
    extensions = new ExtensionFeedItem[] { promotionFeedItem },
};

広告表示オプションの更新

レストランの土曜日のサービスタイムを午後 5 時~午後 10 時に変更するとします。

まずは、既存の設定のリストを取得します。

// Get the CampaignExtensionSettingService.
CampaignExtensionSettingService campaignExtensionSettingService =
    (CampaignExtensionSettingService) user.GetService(
         AdWordsService.v201705.CampaignExtensionSettingService);

Selector selector = new Selector() {
    fields = new string[] { "CampaignId", "ExtensionType", "Extensions" },
    predicates = new Predicate[] {
        new Predicate() {
            field = "CampaignId",
            @operator = PredicateOperator.EQUALS,
            values = new string[] {campaignId.ToString()}
        },
        new Predicate() {
            field = "ExtensionType",
            @operator = PredicateOperator.EQUALS,
            values = new string[] {"SITELINK"}
        },
    }
};

CampaignExtensionSettingPage page = campaignExtensionSettingService.get(selector);

次に、目的のサイトリンクを更新します。

CampaignExtensionSetting campaignExtensionSetting = page.entries[0];
foreach (SitelinkFeedItem siteLink in
     campaignExtensionSetting.extensionSetting.extensions) {
  if (siteLink.sitelinkText == "Happy hours") {
    foreach (FeedItemSchedule schedule in siteLink.scheduling) {
      if (schedule.dayOfWeek == AdWords.v201705.DayOfWeek.SATURDAY) {
         schedule.startHour = 17;
         schedule.startMinute = MinuteOfHour.ZERO;
         schedule.endHour = 22;
         schedule.endMinute = MinuteOfHour.ZERO;
      }
    }
  }
}

最後に、変更した campaignExtensionSetting をサーバーに送信します。

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
  operand = campaignExtensionSetting,
  @operator = Operator.SET,
};

以前の設定が新しい設定で上書きされるのを防ぐため、変更するフィード アイテムが 1 つだけの場合も、すべてのフィード アイテムをサーバーに送信するようにしてください。

広告表示オプションを削除する

広告表示オプション設定サービスは、フィードを使用して広告表示オプションを管理する仕組みになっています。新しい広告表示オプション設定を作成すると、使用したサービスに応じて、フィード アイテムが適切なフィードに作成され、指定したキャンペーン、広告グループ、またはアカウントに関連付けられます。

同様に、広告表示オプション設定から ExtensionFeedItem を削除したり、広告表示オプション設定全体を削除したりすると、フィード アイテムと関連エンティティ間の関連付けが削除されます。しかし、フィード アイテム自体は他のエンティティと関連付けられている可能性があるため削除されません

フィード アイテムとエンティティの関連付けを削除するには、次の 2 つの方法があります。

  1. 広告表示オプション設定全体を削除するには、REMOVE 演算子を使います。これにより、広告表示オプション設定でエンティティとすべてのフィード アイテム間の関連付けが削除されます。
  2. 広告表示オプション設定内の個々の ExtensionFeedItem を削除するには、削除する ExtensionFeedItem を含まない新しいセットを指定します。

どちらの場合も、基となるフィード アイテムは削除されません。したがって、フィード アイテムが他のエンティティと関連付けられていない場合は、フィード アイテムを削除することをおすすめします。これにより、新しい広告表示オプション機能を生成するためのスペースが解放されます。または、他の広告表示オプション設定にフィード アイテムを再利用することもできます。

広告表示オプションの削除時に、作成したフィード アイテムを広告表示オプション設定サービスから削除または再利用しないと、これらのフィード アイテムは時間が経つにつれて増加し、最終的にはアカウントで使用できるフィード アイテム数の上限に達する可能性があります。

フィード アイテムを削除する

基となるフィード アイテムとエンティティとの関連付けを解除した後にそのフィード アイテムを削除する場合は、削除する広告表示オプションから feedIdfeedItemId を取得し、対応する FeedItem を削除します。

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
  operand = campaignExtensionSetting,
  @operator = Operator.REMOVE,
};

campaignExtensionSettingService.mutate(new CampaignExtensionSettingOperation[] {operation});

List<FeedItemOperation> operations = new List<FeedItemOperation>();
foreach(ExtensionFeedItem extensionFeedItem in
    campaignExtensionSetting.extensionSetting.extensions) {
  FeedItemOperation operation = new FeedItemOperation() {
    @operator = Operator.REMOVE,
    operand = new FeedItem() {
      feedItemId = extensionFeedItem.feedItemId,
      feedId = extensionFeedItem.feedId
    }
  };
  operations.Add(operation);
}

feedItemService.mutate(operations.ToArray());

最初の REMOVE は、CampaignExtensionSettingService でその広告表示オプションとキャンペーン間の関連付けを削除します。2 番目の REMOVE は、FeedItemService で基となるフィード アイテムを削除し、後に新しい広告表示オプションを使用できるようにスペースを解放します。

フィード アイテムを再利用する

同じフィード アイテムを複数のエンティティに関連付けることができます。たとえば、同じサイトリンクを複数のキャンペーンに表示する場合は、各キャンペーンを同じフィード アイテムのセットに関連付けることができます。

同様に、1 つのエンティティから広告表示オプションを削除した後、レスポンスから feedItemId を取得することによって、基となるフィード アイテムを別のエンティティに関連付けることができます。

たとえば、以前に削除した広告表示オプション設定の古い feedItemId を変数 storedFeedItemId で格納している場合は、feedItemId のみを SitelinkFeedItem に入力することでそれを再利用できます。

SitelinkFeedItem link = new SitelinkFeedItem() {
  feedItemId = storedFeedItemId
};

CampaignExtensionSetting campaignExtensionSetting = new CampaignExtensionSetting();
campaignExtensionSetting.extensionSetting = new ExtensionSetting() {
  extensions = new ExtensionFeedItem[] {
    link
  }
};

CampaignExtensionSettingOperation operation = new CampaignExtensionSettingOperation() {
  operand = campaignExtensionSetting,
  @operator = Operator.ADD,
};

CampaignExtensionSettingReturnValue retVal = campaignExtensionSettingService.mutate(
    new CampaignExtensionSettingOperation[] {operation});

広告表示オプションのターゲット設定オプション

ExtensionSetting を使うと、顧客キャンペーン広告グループの各単位で広告表示オプションのターゲット設定を行うことができますが、campaignTargetingadGroupTargetingkeywordTargetinggeoTargeting 属性を設定すると、個別の ExtensionFeedItem のターゲット設定を行うこともできます。

このターゲット設定オプションは、ExtensionSetting プロパティと組み合わされ、各インプレッションでフィード アイテムに使用される広告表示オプションが選択されます。

たとえば、次のターゲット設定オプションを使って SitelinkFeedItem を作成するとします。

adGroupTargeting.TargetingAdGroupId = 12345
keywordTargeting.id = 7890

さらに、AdGroupExtensionSettingプラットフォーム制限MOBILE に設定します。

この広告グループのインプレッションが発生する際に、インプレッションの属性が AdGroupExtensionSettingSitelinkFeedItem の両方のオブジェクトのターゲット設定 オプションに合致している場合は、SitelinkFeedItem のサイトリンクのみが掲載されます。

ケース インプレッションの属性 結果
1
  • 広告グループ ID 12345
  • キーワード 7890
  • PC ユーザー
プラットフォーム(PC)が AdGroupExtensionSetting の ターゲット設定オプションに合致しないため、SitelinkFeedItem は 使用されません。
2
  • 広告グループ ID 12345
  • キーワード 8910
  • モバイル ユーザー
キーワード(7890)が SitelinkFeedItem の ターゲット設定オプションに合致しないため、SitelinkFeedItem は 使用されません。
3
  • 広告グループ ID 12345
  • キーワード 7890
  • モバイル ユーザー
属性が AdGroupExtensionSettingSitelinkFeedItem の両方の ターゲット設定オプションに合致するため、SitelinkFeedItem が使用されます。

広告表示オプションの掲載結果のトラッキング

広告表示オプションの掲載結果をトラッキングするには、プレースホルダ レポートまたはプレースホルダ フィード アイテム レポートを使います。使用された広告表示オプションを確認するには FeedItemId 列を使います。

広告表示オプションから広告表示オプション設定サービスへの移行

広告表示オプション設定サービスの長所と短所について、 またサービスへの移行方法について説明します。移行すべきか、フィード サービス を引き続き使用すべきかの判断材料としてご利用ください。

広告表示オプション設定サービスは、従来のフィードベースの広告表示オプション よりも簡単に扱うことができます。この新しいサービスの特長は次のとおりです。

  • すでにサポートされている広告表示オプションをすべてサポート。
  • キャンペーンまたは広告グループの広告表示オプションを管理できる 簡単な API を提供。

移行する必要があるかどうか

広告表示オプション設定サービスは、現在 AdWords 管理画面で利用できる すべての広告表示オプション機能に対応しています。ほとんどのユーザーは、現行のサービスを変更し、データ移行を行って簡単な広告表示オプション設定サービスを利用することでメリットを得ることができます。広告表示オプション設定サービスに移行するかどうかを決める際に以下の点を考慮してください。

広告表示オプション設定サービスが適切な状況

広告表示オプションをキャンペーンまたは広告グループに単に追加する場合は、 デバイス設定を使うか、スケジュールを管理したうえで、広告表示オプション設定 サービスを使うことをおすすめします。広告表示オプション設定サービスは、 フィード サービスと異なりフィードのスキーマとデータが 保持されるため、元になるフィード構成に合わせる必要が ないというメリットがあります。

従来のフィード サービスが適切な状況

次のいずれかの機能を使用する必要がある場合は、従来のフィード サービスを 使用することをおすすめします。

  • 住所表示オプション: 広告表示オプション設定サービスでは住所表示オプションが サポートされていません。
  • カスタム フィールドまたはマッチング関数: 広告表示オプション設定 サービスでは、フィードのカスタム フィールドや、カスタム マッチング関数の 記述がサポートされていません。
  • 複数のフィード: 広告表示オプション設定サービスでは、システムで 管理される広告表示オプション 1 つにつき、1 つのフィードのみがサポートされています。

移行手順

AdWords 管理画面で作成したフィードのみを使用している場合は、 すぐに広告表示オプション設定サービスを使用できます。

ただし、API でカスタム フィード作成した場合は、はじめに次の手順を 行う必要があります。

  1. カスタム フィードのフィード アイテムを取得します。
  2. 保持するフィード アイテムを特定します。
  3. 保持するフィード アイテムを使用する CustomerFeedCampaignFeedAdGroupFeed をカスタム フィードから削除します。
  4. 新しい ExtensionFeedItem を使用する CustomerExtensionSettingCampaignExtensionSettingAdGroupExtensionSetting を作成します。
  5. (省略可)使用していないフィード アイテムを削除します。

以下の項では、キャンペーン単位での広告表示オプションの移行方法を 中心に取り上げますが、広告グループ単位でも同じ手順を適用できます。

カスタム フィードのフィード アイテムを取得する

カスタム フィードのフィード アイテムを取得するには、次のように、 まず AdWords API を使って作成したすべてのカスタム フィードを 特定する必要があります。

private Feed[] GetFeeds(AdWordsUser user) {
  FeedService feedService = (FeedService)user.GetService(
      AdWordsService.v201705.FeedService);
  FeedPage page = feedService.query("SELECT Id, Name, Attributes where " +
      "Origin='USER' and FeedStatus='ENABLED'");
  return page.entries;
}

次に、特定したフィードのフィード アイテムを取得します。この例ではサイトリンクを 使用していますが、その他の広告表示オプションでも同様です。

private FeedItem[] GetFeedItems(AdWordsUser user, long feedId) {
  FeedItemService feedItemService = (FeedItemService) user.GetService(
      AdWordsService.v201705.FeedItemService);
  FeedItemPage page = feedItemService.query(string.Format("Select FeedItemId, " +
      "AttributeValues, Scheduling where Status = 'ENABLED' and FeedId = '{0}'", feedId));
  return page.entries;
}

取り扱いやすくするため、SitelinkFromFeed という名前でローカルで定義したクラスに 値を読み込みます。

class SiteLinkFromFeed {
  public long FeedId {get;set;}
  public long FeedItemId { get; set; }
  public string Text { get; set; }
  public string Url { get; set; }
  public string[] FinalUrls { get; set; }
  public string[] FinalMobileUrls { get; set; }
  public string TrackingUrlTemplate { get; set; }
  public string Line2 { get; set; }
  public string Line3 { get; set; }
  public FeedItemSchedule[] Scheduling { get; set; }
}

また、FeedMapping を解析しやすくするため、定数をいくつか定義する必要があります。 これらのプレースホルダの値については、 フィード プレースホルダのページで確認できます。

const int PLACEHOLDER_TYPE_SITELINKS = 1;

class SiteLinkFields {
  public const long TEXT = 1;
  public const long URL = 2;
  public const long LINE2 = 3;
  public const long LINE3 = 4;
  public const long FINAL_URLS = 5;
  public const long FINAL_MOBILE_URLS = 6;
  public const long TRACKING_URL_TEMPLATE = 7;
};

FeedItemSitelinksFromFeed オブジェクトに変換するには、フィードの FeedMapping を取得してから、各属性をオブジェクトの対応するプロパティに マッピングする必要があります。

private Dictionary<long, SiteLinkFromFeed> GetSiteLinksFromFeed(AdWordsUser user,
    long feedId) {
  Dictionary<long, SiteLinkFromFeed> siteLinks =
      new Dictionary<long, SiteLinkFromFeed>();

  Dictionary<long, long> feedMappings = GetFeedMapping(user, feedId,
      PLACEHOLDER_TYPE_SITELINKS);
  FeedItem[] feedItems = GetFeedItems(user, feedId);

  if (feedItems != null) {
    foreach (FeedItem feedItem in feedItems) {
      SiteLinkFromFeed sitelinkFromFeed = new SiteLinkFromFeed() {
        FeedId = feedItem.feedId,
        FeedItemId = feedItem.feedItemId
      };
      foreach (FeedItemAttributeValue attributeValue in feedItem.attributeValues) {
        switch (attributeValue.feedAttributeId) {
          case SiteLinkFields.TEXT:
            sitelinkFromFeed.Text = attributeValue.stringValue;
            break;

          case SiteLinkFields.URL:
            sitelinkFromFeed.Url = attributeValue.stringValue;
            break;

          case SiteLinkFields.FINAL_URLS:
            sitelinkFromFeed.FinalUrls = attributeValue.stringValues;
            break;

          case SiteLinkFields.FINAL_MOBILE_URLS:
            sitelinkFromFeed.FinalMobileUrls = attributeValue.stringValues;
            break;

          case SiteLinkFields.TRACKING_URL_TEMPLATE:
            sitelinkFromFeed.TrackingUrlTemplate = attributeValue.stringValue;
            break;

          case SiteLinkFields.LINE2:
            sitelinkFromFeed.Line2 = attributeValue.stringValue;
            break;

          case SiteLinkFields.LINE3:
            sitelinkFromFeed.Text = attributeValue.stringValue;
            break;
        }
      }
      sitelinkFromFeed.Scheduling = feedItem.scheduling;
      siteLinks.Add(feedItem.feedItemId, sitelinkFromFeed);
    }
  }
  return siteLinks;
}

private Dictionary<long, long> GetFeedMapping(AdWordsUser user, long feedId,
    long placeHolderType) {
  FeedMappingService feedMappingService = (FeedMappingService) user.GetService(
      AdWordsService.v201705.FeedMappingService);
  FeedMappingPage page = feedMappingService.query(string.Format(
      "SELECT FeedMappingId,AttributeFieldMappings where FeedId='{0}' " +
      "and PlaceholderType={1} and Status='ENABLED'",
      feedId, placeHolderType));

  Dictionary<long, long> attributeMappings = new Dictionary<long, long>();

  if (page.entries != null) {
    foreach (FeedMapping feedMapping in page.entries) {
      foreach (AttributeFieldMapping attributeMapping in
          feedMapping.attributeFieldMappings) {
        attributeMappings.Add(attributeMapping.feedAttributeId,
            attributeMapping.fieldId);
      }
    }
  }
  return attributeMappings;
}

保持するフィード アイテムを特定する

キャンペーンに関連付けられたフィード アイテムのリストを特定するには、キャンペーンに関連付けられた CampaignFeed を取得し、その matchingFunction を解析します。マッチング関数では汎用の式木を記述できるため、さまざまなケースに適用できるパーサーを記述すると複雑になります。そのため、このガイドでは割愛します。代わりにここでは、1 つのフィードに含まれる数個のフィード アイテムが キャンペーンに関連付けられているという簡単なケースを想定します。 このマッチング関数は次のような形式になります。

FEEDITEM_ID IN (FEEDITEM_ID_1, FEEDITEM_ID_2…)

private CampaignFeed[] GetCampaignFeeds(AdWordsUser user, Feed feed, int placeholderType) {
  CampaignFeedService campaignFeedService = (CampaignFeedService) user.GetService(
      AdWordsService.v201705.CampaignFeedService);

  CampaignFeedPage page = campaignFeedService.query(string.Format(
      "SELECT CampaignId, MatchingFunction, PlaceholderTypes where Status='ENABLED' " +
      "and FeedId = '{0}' and PlaceholderTypes CONTAINS_ANY[{1}]", feed.id, placeholderType));
  return page.entries;
}

private List<long> GetFeedItemsForCampaign(CampaignFeed campaignFeed) {
  List<long> feedItems = new List<long>();
  if (campaignFeed.matchingFunction.lhsOperand.Length == 1 &&
      campaignFeed.matchingFunction.lhsOperand[0] is RequestContextOperand &&
      (campaignFeed.matchingFunction.lhsOperand[0] as
           RequestContextOperand).contextType ==
           RequestContextOperandContextType.FEED_ITEM_ID &&
      campaignFeed.matchingFunction.@operator == FunctionOperator.IN) {
    foreach (ConstantOperand argument in campaignFeed.matchingFunction.rhsOperand) {
      feedItems.Add(argument.longValue);
    }
  }
  return feedItems;
}

既存の CampaignFeed の削除

広告表示オプション設定をキャンペーンに追加する前に、キャンペーンの 既存の CampaignFeed を削除する必要があります。これは、キャンペーンの広告表示 オプション 1 つにつき、サポートされる CampaignFeed が 1 つだけであるためです。手動で作成した CampaignFeed を削除すると、広告表示オプション設定を追加する際に、CampaignExtensionSettingService を使って、システムで管理される CampaignFeed を新しく作成できます。

private CampaignFeed DeleteCampaignFeed(AdWordsUser user, CampaignFeed campaignFeed) {
  CampaignFeedService campaignFeedService = (CampaignFeedService) user.GetService(
      AdWordsService.v201705.CampaignFeedService);

  CampaignFeedOperation operation = new CampaignFeedOperation() {
    operand = campaignFeed,
    @operator = Operator.REMOVE,
  };

  return campaignFeedService.mutate(
       new CampaignFeedOperation[] { operation }).value[0];
}

広告表示オプション設定の追加

これで、以前のフィード アイテムに対応する広告表示オプション設定を作成できます。

private static void CreateExtensionSetting(AdWordsUser user,
    Dictionary<long, SiteLinkFromFeed> feedItems, CampaignFeed campaignFeed,
    List<long> feedItemIds) {
  CampaignExtensionSetting extensionSetting = new CampaignExtensionSetting() {
    campaignId = campaignFeed.campaignId,
    extensionType = FeedType.SITELINK,
    extensionSetting = new ExtensionSetting() {
    }
  };

  List<ExtensionFeedItem> extensionFeedItems = new List<ExtensionFeedItem>();

  foreach (long feedItemId in feedItemIds) {
    SiteLinkFromFeed feedItem = feedItems[feedItemId];
    SitelinkFeedItem newFeedItem = new SitelinkFeedItem() {
      sitelinkText = feedItem.Text,
      sitelinkUrl = feedItem.Url,
      sitelinkFinalUrls = feedItem.FinalUrls,
      sitelinkFinalMobileUrls = feedItem.FinalMobileUrls,
      sitelinkTrackingUrlTemplate = feedItem.TrackingUrlTemplate,
      sitelinkLine2 = feedItem.Line2,
      sitelinkLine3 = feedItem.Line3,
      scheduling = feedItem.Scheduling
    };
    extensionFeedItems.Add(newFeedItem);
  }
  extensionSetting.extensionSetting.extensions = extensionFeedItems.ToArray();

  CampaignExtensionSettingService campaignExtensionSettingService =
      (CampaignExtensionSettingService) user.GetService(
          AdWordsService.v201705.CampaignExtensionSettingService);
  CampaignExtensionSettingOperation operation =
      new CampaignExtensionSettingOperation() {
        operand = extensionSetting,
        @operator = Operator.ADD
      };

  campaignExtensionSettingService.mutate(
      new CampaignExtensionSettingOperation[] {operation});
  return;
}

この処理では、広告表示オプション設定の重複対策を行っていないため、 重複する項目を除外するよう、このコードを改良することをおすすめします。

以前の FeedItems の削除

最後に、以前の FeedItems を削除します。

private void DeleteOldFeedItems(AdWordsUser user, List<long> feedItemIds,
    long feedId) {
  if (feedItemIds.Count == 0) {
    return;
  }
  List<FeedItemOperation> operations = new List<FeedItemOperation>();
  foreach (long feedItemId in feedItemIds) {
    FeedItemOperation operation = new FeedItemOperation() {
      @operator = Operator.REMOVE,
      operand = new FeedItem() {
        feedItemId = feedItemId,
        feedId = feedId
      }
    };
    operations.Add(operation);
  }
  FeedItemService feedItemService = (FeedItemService) user.GetService(
      AdWordsService.v201705.FeedItemService);
  feedItemService.mutate(operations.ToArray());
  return;
}

これは省略可能な処理ですが、アクティブなフィード アイテム数が システムの上限を超えないように、使用していないフィード アイテムを 削除することをおすすめします。

まとめ: メインループ

このプログラムのメインループは、ここまでに説明した処理に順番に対応しています。

Feed[] feeds = GetFeeds(user);
foreach (Feed feed in feeds) {
  Dictionary<long, SiteLinkFromFeed> feedItems = GetSiteLinksFromFeed(user, feed.id);
  CampaignFeed[] campaignFeeds = GetCampaignFeeds(user, feed,
      PLACEHOLDER_TYPE_SITELINKS);

  if (campaignFeeds != null) {
    HashSet<long> allFeedItemsToDelete = new HashSet<long>();
    foreach (CampaignFeed campaignFeed in campaignFeeds) {
      // Optional: Replace with custom logic that upgrades only selected
      // feed items.
      List<long> feedItemIds = GetFeedItemsForCampaign(campaignFeed);
      DeleteCampaignFeed(user, campaignFeed);
      CreateExtensionSetting(user, feedItems, campaignFeed, feedItemIds);
      allFeedItemsToDelete.UnionWith(feedItemIds);
    }
    DeleteOldFeedItems(user, new List<long>(allFeedItemsToDelete), feed.id);
  }
}

コードサンプル

広告表示オプション設定サービスについて詳しくは、クライアント ライブラリ に収録されている以下のコードサンプルを参考にしてください。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。