アフィリエイト住所表示オプション

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

アフィリエイト住所表示オプションを使用するには、アカウントで新しいアフィリエイト住所表示オプション フィードを作成する必要があります。FeedService.MutateFeeds create オペレーションを実行して、フィードを作成します。

Java

private String createAffiliateLocationExtensionFeed(
    GoogleAdsClient googleAdsClient, long customerId, long chainId) {
  // Removes all existing location extension feeds. This is an optional step, but is required for
  // this code example to run correctly more than once. This is because:
  //   1. Google Ads only allows one location extension feed per email address.
  //   2. A Google Ads account cannot have a location extension feed and an affiliate
  // location extension feed at the same time.
  removeLocationExtensionFeeds(googleAdsClient, customerId);

  // Creates a feed that will sync to retail addresses for a given retail chain ID.
  // Do not add FeedAttributes to this object as Google Ads will add
  // them automatically because this will be a system generated feed.
  Feed feed =
      Feed.newBuilder()
          .setName("Affiliate Location Extension feed #" + getPrintableDateTime())
          .setAffiliateLocationFeedData(
              AffiliateLocationFeedData.newBuilder()
                  .addChainIds(chainId)
                  .setRelationshipType(AffiliateLocationFeedRelationshipType.GENERAL_RETAILER))
          // Since this feed's contents will be managed by Google,
          // you must set its origin to GOOGLE.
          .setOrigin(FeedOrigin.GOOGLE)
          .build();

  // Constructs an operation to create the feed.
  FeedOperation op = FeedOperation.newBuilder().setCreate(feed).build();

  // Creates the FeedServiceClient.
  try (FeedServiceClient feedService =
      googleAdsClient.getLatestVersion().createFeedServiceClient()) {
    // Issues a mutate request to add the feed.
    MutateFeedsResponse response =
        feedService.mutateFeeds(String.valueOf(customerId), ImmutableList.of(op));

    // Displays the results.
    String resourceName = response.getResults(0).getResourceName();
    System.out.printf(
        "Affliate location extension feed created with resource name: %s.%n", resourceName);

    return resourceName;
  }
}
      

C#

private static string CreateAffiliateLocationExtensionFeed(GoogleAdsClient client,
    long customerId, long chainId)
{
    // Optional: Delete all existing location extension feeds. This is an optional step, and
    // is required for this code example to run correctly more than once.
    // 1. Google Ads only allows one location extension feed per email address.
    // 2. A Google Ads account cannot have a location extension feed and an affiliate
    // location extension feed at the same time.
    DeleteLocationExtensionFeeds(client, customerId);

    // Get the FeedServiceClient.
    FeedServiceClient feedService = client.GetService(Services.V13.FeedService);

    // Creates a feed that will sync to retail addresses for a given retail chain ID. Do not
    // add FeedAttributes to this object as Google Ads will add them automatically because
    // this will be a system generated feed.
    Feed feed = new Feed()
    {
        Name = "Affiliate Location Extension feed #" + ExampleUtilities.GetRandomString(),

        AffiliateLocationFeedData = new AffiliateLocationFeedData()
        {
            ChainIds = { chainId },
            RelationshipType = AffiliateLocationFeedRelationshipType.GeneralRetailer
        },
        // Since this feed's contents will be managed by Google, you must set its origin to
        // GOOGLE.
        Origin = FeedOrigin.Google
    };

    FeedOperation operation = new FeedOperation()
    {
        Create = feed
    };

    // Adds the feed.
    MutateFeedsResponse response =
        feedService.MutateFeeds(customerId.ToString(), new[] { operation });

    // Displays the results.
    string feedResourceName = response.Results[0].ResourceName;
    Console.WriteLine($"Affliate location extension feed created with resource name: " +
        $"{feedResourceName}.");
    return feedResourceName;
}
      

PHP

private static function createAffiliateLocationExtensionFeed(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    int $chainId
): string {
    // Creates a feed that will sync to retail addresses for a given retail chain ID.
    // Do not add feed attributes, Google Ads will add them automatically because this will
    // be a system generated feed.
    $feed = new Feed([
        'name' => 'Affiliate Location Extension feed #' . Helper::getPrintableDatetime(),
        'affiliate_location_feed_data' => new AffiliateLocationFeedData([
            'chain_ids' => [$chainId],
            'relationship_type' => AffiliateLocationFeedRelationshipType::GENERAL_RETAILER
        ]),
        // Since this feed's contents will be managed by Google, you must set its origin to
        // GOOGLE.
        'origin' => FeedOrigin::GOOGLE
    ]);

    // Creates the feed operation.
    $operation = new FeedOperation();
    $operation->setCreate($feed);

    // Issues a mutate request to add the feed and prints some information.
    $feedServiceClient = $googleAdsClient->getFeedServiceClient();
    $response = $feedServiceClient->mutateFeeds($customerId, [$operation]);
    $feedResourceName = $response->getResults()[0]->getResourceName();
    printf(
        "Affiliate location extension feed created with resource name: '%s'.%s",
        $feedResourceName,
        PHP_EOL
    );

    return $feedResourceName;
}
      

Python

def create_affiliate_location_extension_feed(client, customer_id, chain_id):
    """Creates the Affiliate Location Extension feed.

    Args:
        client: The Google Ads API client.
        customer_id: The Google Ads customer ID.
        chain_id: The retail chain ID.

    Returns:
        The string resource name of the newly created Affiliate Location
        Extension feed.
    """
    # Optional: Remove all existing location extension feeds. This is an
    # optional step, and is required for this code example to run correctly more
    # than once.
    # This is because Google Ads only allows one location extension feed per
    # email address, and a Google Ads account cannot have a location extension
    # feed and an affiliate location extension feed at the same time.
    remove_location_extension_feeds(client, customer_id)

    # Get the FeedServiceClient.
    feed_service = client.get_service("FeedService")

    # Create a feed that will sync to retail addresses for a given retail chain
    # ID. Do not add FeedAttributes to this object as Google Ads will add
    # them automatically as this will be a system generated feed.
    feed_operation = client.get_type("FeedOperation")
    feed = feed_operation.create
    feed.name = f"Affiliate Location Extension feed #{uuid4()}"
    feed.affiliate_location_feed_data.chain_ids.append(chain_id)
    feed.affiliate_location_feed_data.relationship_type = (
        client.enums.AffiliateLocationFeedRelationshipTypeEnum.GENERAL_RETAILER
    )
    # Since this feed's contents will be managed by Google, you must set its
    # origin to GOOGLE.
    feed.origin = client.enums.FeedOriginEnum.GOOGLE

    # Add the feed.
    mutate_feeds_response = feed_service.mutate_feeds(
        customer_id=customer_id, operations=[feed_operation]
    )

    # Display the results.
    feed_resource_name = mutate_feeds_response.results[0].resource_name
    print(
        "Affiliate location extension feed created with resource name: "
        f"{feed_resource_name}."
    )
    return feed_resource_name
      

Ruby

def create_affiliate_location_extension_feed(client, customer_id, chain_id)
  # Creates a feed that will sync to retail addresses for a given retail
  # chain ID.
  # Do not add feed attributes, Google Ads will add them automatically because
  # this will be a system generated feed.
  operation = client.operation.create_resource.feed do |feed|
    feed.name = "Affiliate Location Extension feed ##{(Time.new.to_f * 1000).to_i}"
    feed.affiliate_location_feed_data = client.resource.affiliate_location_feed_data do |data|
      data.chain_ids << chain_id
      data.relationship_type = :GENERAL_RETAILER
    end
    # Since this feed's contents will be managed by Google, you must set its
    # origin to GOOGLE.
    feed.origin = :GOOGLE
  end

  # Issues a mutate request to add the feed and prints some information.
  response = client.service.feed.mutate_feeds(
    customer_id: customer_id,
    operations: [operation],
  )

  feed_resource_name = response.results.first.resource_name
  puts "Affiliate location extension feed created with resource name: #{feed_resource_name}"

  feed_resource_name
end
      

Perl

sub create_affiliate_location_extension_feed {
  my ($api_client, $customer_id, $chain_id) = @_;

  # Create a feed that will sync to retail addresses for a given retail chain ID.
  # Do not add feed attributes, Google Ads will add them automatically because
  # this will be a system generated feed.
  my $feed = Google::Ads::GoogleAds::V13::Resources::Feed->new({
      name => "Affiliate Location Extension feed #" . uniqid(),
      affiliateLocationFeedData =>
        Google::Ads::GoogleAds::V13::Resources::AffiliateLocationFeedData->new({
          chainIds         => [$chain_id],
          relationshipType => GENERAL_RETAILER
        }
        ),
      # Since this feed's contents will be managed by Google, you must set its
      # origin to GOOGLE.
      origin => GOOGLE
    });

  # Create the feed operation.
  my $operation =
    Google::Ads::GoogleAds::V13::Services::FeedService::FeedOperation->new({
      create => $feed
    });

  # Issue a mutate request to add the feed and print some information.
  my $response = $api_client->FeedService()->mutate({
      customerId => $customer_id,
      operations => [$operation]});
  my $feed_resource_name = $response->{results}[0]{resourceName};
  printf
    "Affiliate location extension feed created with resource name: '%s'.\n",
    $feed_resource_name;

  return $feed_resource_name;
}
      

住所表示オプション フィードに固有の以下のフィールドに値を入力する必要があります。

属性 必須 説明
origin 対応 住所表示オプションのフィードはシステムで生成されるため、origin フィールドを GOOGLE に設定する必要があります。
attributes × フィードに attributes を指定しないでください。これはシステムで生成されたフィードであるため、Google 広告によって自動生成されます。
affiliate_location_feed_data × フィードの affiliate_location_feed_data 属性を AffiliateLocationFeedData オブジェクトに設定すると、Google 広告に次のような処理が行われます。
  • フィードのフィード属性を自動的に作成する。
  • フィードの FeedMapping を自動的に作成します。
  • chain_ids 属性で指定した小売チェーンに対応するビジネス情報のリストをフィードに入力します。

AffiliateLocationFeedData の属性

属性 必須 説明
chain_ids 表示 宣伝するチェーンのリスト。有効なチェーン ID のリストをご覧ください。
relationship_type 表示 広告主と小売チェーンの関係タイプ。

フィードの準備が整うまで待ちます

Feed を作成すると、フィード属性と FeedMapping が作成されます。その後、ビジネス プロフィールのビジネス情報に対応する FeedItem オブジェクトを作成して、フィードのコンテンツを設定します。

FeedMapping が作成されるまで待ってから、フィードが適切に設定され、次のステップで使用できることを確認する必要があります。これを行うには、placeholder_typeAFFILIATE_LOCATION と等しい関連フィードの FeedMapping を取得します。

Java

private Optional<FeedMapping> getFeedMapping(
    GoogleAdsClient googleAdsServiceClient, long customerId, String feedResourceName) {
  String query =
      String.format(
          "SELECT"
              + "  feed_mapping.resource_name, "
              + "  feed_mapping.attribute_field_mappings, "
              + "  feed_mapping.status "
              + "FROM"
              + "  feed_mapping "
              + "WHERE feed_mapping.feed = '%s'"
              + "  AND feed_mapping.status = ENABLED "
              + "  AND feed_mapping.placeholder_type = AFFILIATE_LOCATION "
              + "LIMIT 1",
          feedResourceName);
  try (GoogleAdsServiceClient client =
      googleAdsServiceClient.getLatestVersion().createGoogleAdsServiceClient()) {
    SearchPagedResponse response = client.search(String.valueOf(customerId), query);
    Iterator<GoogleAdsRow> iterator = response.iterateAll().iterator();
    if (iterator.hasNext()) {
      return Optional.of(iterator.next().getFeedMapping());
    }
    return Optional.empty();
  }
}
      

C#

private static FeedMapping GetAffiliateLocationExtensionFeedMapping(GoogleAdsClient client,
    long customerId, string feedResourceName)
{
    // Get the GoogleAdsService.
    GoogleAdsServiceClient googleAdsService = client.GetService(
        Services.V13.GoogleAdsService);

    // Create the query.
    string query = $"SELECT feed_mapping.resource_name, " +
        $"feed_mapping.attribute_field_mappings, feed_mapping.status FROM " +
        $"feed_mapping WHERE feed_mapping.feed = '{feedResourceName}' and " +
        $"feed_mapping.status = ENABLED and feed_mapping.placeholder_type = " +
        "AFFILIATE_LOCATION LIMIT 1";

    // Issue a search request.
    PagedEnumerable<SearchGoogleAdsResponse, GoogleAdsRow> result =
        googleAdsService.Search(customerId.ToString(), query);

    // Display the results.
    GoogleAdsRow googleAdsRow = result.FirstOrDefault();
    return (googleAdsRow == null) ? null : googleAdsRow.FeedMapping;
}
      

PHP

private static function getAffiliateLocationExtensionFeedMapping(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $feedResourceName
): ?FeedMapping {
    $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
    // Creates a query that retrieves the feed mapping.
    $query = sprintf(
        "SELECT feed_mapping.resource_name, " .
        "feed_mapping.attribute_field_mappings, " .
        "feed_mapping.status " .
        "FROM feed_mapping " .
        "WHERE feed_mapping.feed = '%s' " .
        "AND feed_mapping.status = ENABLED " .
        "AND feed_mapping.placeholder_type = AFFILIATE_LOCATION " .
        "LIMIT 1",
        $feedResourceName
    );

    // Issues a search request.
    $response = $googleAdsServiceClient->search(
        $customerId,
        $query,
        ['returnTotalResultsCount' => true]
    );

    return $response->getPage()->getPageElementCount() === 1
        ? $response->getIterator()->current()->getFeedMapping()
        : null;
}
      

Python

def get_affiliate_location_extension_feed_mapping(
    client, customer_id, feed_resource_name
):
    """Gets the Affiliate Location Extension feed mapping.

    Args:
        client: The Google Ads API client.
        customer_id: The Google Ads customer ID.
        feed_resource_name: The feed resource name.
    Returns:
        The newly created feed mapping.
    """
    # Get the GoogleAdsService.
    googleads_service = client.get_service("GoogleAdsService")

    # Create the query.
    query = f"""
        SELECT
          feed_mapping.resource_name,
          feed_mapping.attribute_field_mappings,
          feed_mapping.status
        FROM feed_mapping
        WHERE
          feed_mapping.feed = '{feed_resource_name}'
          AND feed_mapping.status = ENABLED
          AND feed_mapping.placeholder_type = AFFILIATE_LOCATION
        LIMIT 1"""

    # Issue a search request.
    search_results = googleads_service.search(
        customer_id=customer_id, query=query
    )

    # Return the feed mapping that results from the search.
    # It is possible that the feed is not yet ready, so we catch the exception
    # if the feed mapping is not yet available.
    try:
        row = next(iter(search_results))
    except StopIteration:
        return None
    else:
        return row.feed_mapping
      

Ruby

def get_affiliated_location_extension_feed_mapping(
  client,
  customer_id,
  feed_resource_name)
  # Creates a query that retrieves the feed mapping.
  query = <<~QUERY
    SELECT feed_mapping.resource_name,
           feed_mapping.attribute_field_mappings,
           feed_mapping.status
    FROM feed_mapping
    WHERE feed_mapping.feed = '#{feed_resource_name}'
    AND feed_mapping.status = ENABLED
    AND feed_mapping.placeholder_type = AFFILIATE_LOCATION
    LIMIT 1
  QUERY

  # Issues a search request
  responses = client.service.google_ads.search(
    customer_id: customer_id,
    query: query,
    return_total_results_count: true,
  )

  response = responses.page.response
  response.total_results_count == 1 ? response.results.first.feed_mapping : nil
end
      

Perl

sub get_affiliate_location_extension_feed_mapping {
  my ($api_client, $customer_id, $feed_resource_name) = @_;

  # Create a query that retrieves the feed mapping.
  my $search_query =
    "SELECT feed_mapping.resource_name, " .
    "feed_mapping.attribute_field_mappings, " .
    "feed_mapping.status FROM feed_mapping " .
    "WHERE feed_mapping.feed = '$feed_resource_name' " .
    "AND feed_mapping.status = ENABLED " .
    "AND feed_mapping.placeholder_type = AFFILIATE_LOCATION LIMIT 1";

  # Issue a search request.
  my $response = $api_client->GoogleAdsService()->search({
    customerId              => $customer_id,
    query                   => $search_query,
    returnTotalResultsCount => "true"
  });

  return $response->{totalResultsCount} && $response->{totalResultsCount} == 1
    ? $response->{results}[0]{feedMapping}
    : undef;
}
      

FeedMapping を使用できない場合は、Feed の準備が整うまで指数バックオフ ポリシーを使用して呼び出しを再試行します。

Java

private FeedMapping waitForFeedToBeReady(
    GoogleAdsClient googleAdsServiceClient, long customerId, String feedResourceName) {
  int numAttempts = 0;
  int sleepSeconds = 0;

  // Waits for Google's servers to setup the feed with feed attributes and attribute mapping.
  // This process is asynchronous, so we wait until the feed mapping is created, with exponential
  // backoff.
  while (numAttempts < MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS) {
    Optional<FeedMapping> feedMapping =
        getFeedMapping(googleAdsServiceClient, customerId, feedResourceName);

    if (feedMapping.isPresent()) {
      System.out.printf("Feed with resource name '%s' is now ready.%n", feedResourceName);
      return feedMapping.get();
    } else {
      numAttempts++;
      sleepSeconds = (int) (5 * Math.pow(2, numAttempts));
      System.out.printf(
          "Checked: %d time(s). Feed is not ready "
              + "yet. Waiting %d seconds before trying again.%n",
          numAttempts, sleepSeconds);
      try {
        Thread.sleep(sleepSeconds * 1000);
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new RuntimeException(e);
      }
    }
  }
  throw new ApiException(
      String.format("Feed is not ready after %d retries.", numAttempts),
      null,
      GrpcStatusCode.of(Code.DEADLINE_EXCEEDED),
      true);
}
      

C#

private static FeedMapping WaitForFeedToBeReady(GoogleAdsClient client, long customerId,
    string feedResourceName)
{
    int numAttempts = 0;
    int sleepSeconds = 0;

    while (numAttempts < MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS)
    {
        // Once you create a feed, Google's servers will setup the feed by creating feed
        // attributes and feed mapping. Once the feed mapping is created, it is ready to be
        // used for creating customer feed. This process is asynchronous, so we wait until
        // the feed mapping is created, peforming exponential backoff.
        FeedMapping feedMapping = GetAffiliateLocationExtensionFeedMapping(
            client, customerId, feedResourceName);

        if (feedMapping == null)
        {
            numAttempts++;
            sleepSeconds = (int) (5 * Math.Pow(2, numAttempts));
            Console.WriteLine($"Checked: #{numAttempts} time(s). Feed is not ready " +
                $"yet. Waiting {sleepSeconds} seconds before trying again.");
            Thread.Sleep(sleepSeconds * 1000);
        }
        else
        {
            Console.WriteLine($"Feed {feedResourceName} is now ready.");
            return feedMapping;
        }
    }
    throw new RpcException(new Status(StatusCode.DeadlineExceeded,
        $"Feed is not ready after {MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS}" +
        $" retries."));
}
      

PHP

private static function waitForFeedToBeReady(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    string $feedResourceName
): FeedMapping {
    $numAttempts = 0;

    while ($numAttempts < self::MAX_FEED_MAPPING_RETRIEVAL_ATTEMPTS) {
        // Once you create a feed, Google's servers will setup the feed by creating feed
        // attributes and feed mapping. Once the feed mapping is created, it is ready to be
        // used for creating customer feed.
        // This process is asynchronous, so we wait until the feed mapping is created,
        // performing exponential backoff.
        $feedMapping = self::getAffiliateLocationExtensionFeedMapping(
            $googleAdsClient,
            $customerId,
            $feedResourceName
        );

        if (is_null($feedMapping)) {
            $numAttempts++;
            $sleepSeconds = intval(5 * pow(2, $numAttempts));
            printf(
                'Checked: %d time(s). Feed is not ready yet. ' .
                'Waiting %d seconds before trying again.%s',
                $numAttempts,
                $sleepSeconds,
                PHP_EOL
            );
            sleep($sleepSeconds);
        } else {
            printf("Feed '%s' is now ready.%s", $feedResourceName, PHP_EOL);
            return $feedMapping;
        }
    }

    throw new RuntimeException(sprintf(
        "The affiliate location feed mapping is still not ready after %d attempt(s).%s",
        self::MAX_FEED_MAPPING_RETRIEVAL_ATTEMPTS,
        PHP_EOL
    ));
}
      

Python

def wait_for_feed_to_be_ready(client, customer_id, feed_resource_name):
    """Waits for the Affiliate location extension feed to be ready.

    Args:
        client: The Google Ads API client.
        customer_id: The Google Ads customer ID.
        feed_resource_name: The resource name of the feed.

    Returns:
        The newly created FeedMapping.

    Raises:
        Exception: if the feed is not ready after the specified number of
            retries.
    """
    num_attempts = 0
    sleep_seconds = 0

    while num_attempts < MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS:
        # Once you create a feed, Google's servers will setup the feed by
        # creating feed attributes and feed mapping. Once the feed mapping is
        # created, it is ready to be used for creating customer feed.
        # This process is asynchronous, so we wait until the feed mapping is
        # created, performing exponential backoff.
        feed_mapping = get_affiliate_location_extension_feed_mapping(
            client, customer_id, feed_resource_name
        )

        if feed_mapping is None:
            num_attempts += 1
            sleep_seconds = 5 * 2 ** num_attempts
            print(
                f"Checked {num_attempts} time(s). Feed is not ready "
                f"yet. Waiting {sleep_seconds} seconds before trying again."
            )
            sleep(sleep_seconds)
        else:
            print(f"Feed {feed_resource_name} is now ready.")
            return feed_mapping

    raise Exception(
        f"Feed is not ready after "
        f"{MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS} retries."
    )
      

Ruby

def wait_for_feed_to_be_ready(client, customer_id, feed_resource_name)
  number_of_attempts = 0

  while number_of_attempts < MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS
    # Once you create a feed, Google's servers will setup the feed by creating
    # feed attributes and feed mapping. Once the feed mapping is created, it is
    # ready to be used for creating customer feed.
    # This process is asynchronous, so we wait until the feed mapping is
    # created, performing exponential backoff.
    feed_mapping = get_affiliated_location_extension_feed_mapping(
      client, customer_id, feed_resource_name)

    if feed_mapping.nil?
      number_of_attempts += 1
      sleep_seconds = POLL_FREQUENCY_SECONDS * (2 ** number_of_attempts)
      puts "Checked #{number_of_attempts} time(s). Feed is not ready yet. " \
        "Waiting #{sleep_seconds} seconds before trying again."
      sleep sleep_seconds
    else
      puts "Feed #{feed_resource_name} is now ready."
      return feed_mapping
    end
  end

  raise "The affiliate location feed mapping is still not ready after " \
    "#{MAX_FEEDMAPPING_RETRIEVAL_ATTEMPTS} attempt(s)."
end
      

Perl

sub wait_for_feed_to_be_ready {
  my ($api_client, $customer_id, $feed_resource_name) = @_;

  my $num_attempts = 0;
  while ($num_attempts < MAX_FEED_MAPPING_RETRIEVAL_ATTEMPTS) {
    # Once you create a feed, Google's servers will setup the feed by creating
    # feed attributes and feed mapping. Once the feed mapping is created, it is
    # ready to be used for creating customer feed.
    # This process is asynchronous, so we wait until the feed mapping is created,
    # performing exponential backoff.
    my $feed_mapping =
      get_affiliate_location_extension_feed_mapping($api_client, $customer_id,
      $feed_resource_name);

    if (!$feed_mapping) {
      $num_attempts++;
      my $sleep_seconds = 5 * (2**$num_attempts);
      printf "Checked: %d time(s). Feed is not ready yet. " .
        "Waiting %d seconds before trying again.\n",
        $num_attempts,
        $sleep_seconds;
      sleep($sleep_seconds);
    } else {
      printf "Feed '%s' is now ready.\n", $feed_resource_name;
      return $feed_mapping;
    }
  }

  die(
    sprintf "The affiliate location feed mapping is still not ready " .
      "after %d attempt(s).\n",
    MAX_FEED_MAPPING_RETRIEVAL_ATTEMPTS
  );
}
      

フィードをユーザー、キャンペーン、広告グループに関連付ける

フィードを使用する準備ができたら、CampaignFeed オブジェクトを作成してキャンペーンに関連付けることができます。フィードを広告グループまたは顧客に関連付ける点は似ていますが、それぞれ AdGroupFeed オブジェクトまたは CustomerFeed オブジェクトを作成して適切なマッチング関数を使用します。

次のコード スニペットは、キャンペーンのアフィリエイト住所表示オプションをフィルタリングして、1 つの小売チェーン ID の地域のみを配信します。

Java

private void createCampaignFeed(
    GoogleAdsClient googleAdsClient,
    long customerId,
    long campaignId,
    FeedMapping feedMapping,
    String feedResourceName,
    long chainId) {
  // Gets the attribute ID that is used for the chain ID. This will be used to filter the feed to
  // extract affiliate locations.
  long attributeIdForChainId = getAttributeIdForChainId(feedMapping);

  // Extracts the feed ID.
  long feedId = Long.valueOf(FeedName.parse(feedResourceName).getFeedId());

  // Constructs a matching function string which filters the Feed to extract affiliate locations.
  String matchingFunction =
      String.format("IN(FeedAttribute[%d, %d], %d)", feedId, attributeIdForChainId, chainId);

  // Creates a CampaignFeed object.
  CampaignFeed campaignFeed =
      CampaignFeed.newBuilder()
          .setFeed(feedResourceName)
          .addPlaceholderTypes(PlaceholderType.AFFILIATE_LOCATION)
          .setMatchingFunction(
              MatchingFunction.newBuilder().setFunctionString(matchingFunction).build())
          .setCampaign(ResourceNames.campaign(customerId, campaignId))
          .build();

  // Creates an operation to create the CampaignFeed.
  CampaignFeedOperation operation =
      CampaignFeedOperation.newBuilder().setCreate(campaignFeed).build();

  // Adds a CampaignFeed that associates the feed with this campaign for
  // the AFFILIATE_LOCATION placeholder type.
  try (CampaignFeedServiceClient feedServiceClient =
      googleAdsClient.getLatestVersion().createCampaignFeedServiceClient()) {
    MutateCampaignFeedsResponse response =
        feedServiceClient.mutateCampaignFeeds(
            String.valueOf(customerId), ImmutableList.of(operation));
    System.out.printf(
        "Campaign feed created with resource name: %s.%n",
        response.getResultsList().get(0).getResourceName());
  }
}
      

C#

private static void CreateCampaignFeed(GoogleAdsClient client, long customerId,
    long campaignId, FeedMapping feedMapping, string feedResourceName, long chainId)
{
    // Get the CampaignFeedService.
    CampaignFeedServiceClient campaignFeedService = client.GetService(
        Services.V13.CampaignFeedService);

    long attributeIdForChainId = GetAttributeIdForChainId(feedMapping);
    string feedId = FeedName.Parse(feedResourceName).FeedId;

    string matchingFunction =
        $"IN(FeedAttribute[{feedId}, {attributeIdForChainId}], {chainId})";
    // Adds a CampaignFeed that associates the feed with this campaign for the
    // AFFILIATE_LOCATION placeholder type.
    CampaignFeed campaignFeed = new CampaignFeed()
    {
        Feed = feedResourceName,
        PlaceholderTypes = { PlaceholderType.AffiliateLocation },
        MatchingFunction = new MatchingFunction()
        {
            FunctionString = matchingFunction
        },
        Campaign = ResourceNames.Campaign(customerId, campaignId),
    };

    CampaignFeedOperation operation = new CampaignFeedOperation()
    {
        Create = campaignFeed
    };

    MutateCampaignFeedsResponse campaignFeedsResponse =
        campaignFeedService.MutateCampaignFeeds(
            customerId.ToString(), new[] { operation });

    // Displays the result.
    string addedCampaignFeed = campaignFeedsResponse.Results[0].ResourceName;
    Console.WriteLine($"Campaign feed created with resource name: {addedCampaignFeed}.");
    return;
}
      

PHP

private static function createCampaignFeed(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    int $campaignId,
    FeedMapping $feedMapping,
    string $feedResourceName,
    int $chainId
) {
    $matchingFunction = sprintf(
        'IN(FeedAttribute[%d, %d], %d)',
        FeedServiceClient::parseName($feedResourceName)['feed'],
        self::getAttributeIdForChainId($feedMapping),
        $chainId
    );

    // Adds a campaign feed that associates the feed with this campaign for the
    // AFFILIATE_LOCATION placeholder type.
    $campaignFeed = new CampaignFeed([
        'feed' => $feedResourceName,
        'placeholder_types' => [PlaceholderType::AFFILIATE_LOCATION],
        'matching_function' => new MatchingFunction(['function_string' => $matchingFunction]),
        'campaign' => ResourceNames::forCampaign($customerId, $campaignId)
    ]);

    // Creates the campaign feed operation.
    $operation = new CampaignFeedOperation();
    $operation->setCreate($campaignFeed);

    // Issues a mutate request to add the campaign feed and prints some information.
    $campaignFeedServiceClient = $googleAdsClient->getCampaignFeedServiceClient();
    $response = $campaignFeedServiceClient->MutateCampaignFeeds($customerId, [$operation]);
    printf(
        "Campaign feed created with resource name: '%s'.%s",
        $response->getResults()[0]->getResourceName(),
        PHP_EOL
    );
}
      

Python

def create_campaign_feed(
    client, customer_id, campaign_id, feed_mapping, feed_resource_name, chain_id
):
    """Creates the campaign feed.

    Args:
        client: The Google Ads API client.
        customer_id: The Google Ads customer ID.
        campaign_id: The campaign ID to which the affiliate location extensions
            will be added.
        feed_mapping: The affiliate location extension feedmapping for the feed
            resource name.
        feed_resource_name: The feed resource name.
        chain_id: The retail chain ID.
    """
    # Get the CampaignFeedService.
    campaign_feed_service = client.get_service("CampaignFeedService")
    feed_service = client.get_service("FeedService")

    attribute_id_for_chain_id = get_attribute_id_for_chain_id(
        client, feed_mapping
    )
    feed_id = feed_service.parse_feed_path(feed_resource_name)["feed_id"]

    matching_function = (
        f"IN(FeedAttribute[{feed_id}, {attribute_id_for_chain_id}], {chain_id})"
    )

    # Add a CampaignFeed that associates the feed with this campaign for
    # the AFFILIATE_LOCATION placeholder type.
    campaign_feed_operation = client.get_type("CampaignFeedOperation")
    campaign_feed = campaign_feed_operation.create
    campaign_feed.feed = feed_resource_name
    campaign_feed.placeholder_types.append(
        client.enums.PlaceholderTypeEnum.AFFILIATE_LOCATION
    )
    campaign_feed.matching_function.function_string = matching_function
    campaign_feed.campaign = client.get_service(
        "CampaignService"
    ).campaign_path(customer_id, campaign_id)

    mutate_campaign_feeds_response = campaign_feed_service.mutate_campaign_feeds(
        customer_id=customer_id, operations=[campaign_feed_operation]
    )

    # Display the result.
    print(
        "Campaign feed created with resource name: "
        f"{mutate_campaign_feeds_response.results[0].resource_name}."
    )
      

Ruby

def create_campaign_feed(
  client,
  customer_id,
  campaign_id,
  feed_mapping,
  feed_resource_name,
  chain_id)
  matching_function = "IN(FeedAttribute[#{feed_resource_name.split('/')[3]}, " \
    "#{get_attribute_id_for_chain_id(feed_mapping)}], #{chain_id})"

  # Adds a campaign feed that associates the feed with this campaign for the
  # AFFILIATE_LOCATION placeholder type.
  operation = client.operation.create_resource.campaign_feed do |cf|
    cf.feed = feed_resource_name
    cf.placeholder_types << :AFFILIATE_LOCATION
    cf.matching_function = client.resource.matching_function do |m|
      m.function_string = matching_function
    end
    cf.campaign = client.path.campaign(customer_id, campaign_id)
  end

  # Issues a mutate request to add the campaign feed and prints some information.
  response = client.service.campaign_feed.mutate_campaign_feeds(
    customer_id: customer_id,
    operations: [operation],
  )
  puts "Campaign feed created with resource name: " \
    "#{response.results.first.resource_name}"
end
      

Perl

sub create_campaign_feed {
  my ($api_client, $customer_id, $campaign_id, $feed_mapping,
    $feed_resource_name, $chain_id)
    = @_;

  my $feed_id                   = $1 if $feed_resource_name =~ /(\d+)$/;
  my $attribute_id_for_chain_id = get_attribute_id_for_chain_id($feed_mapping);
  my $matching_function =
    "IN(FeedAttribute[$feed_id, $attribute_id_for_chain_id], $chain_id)";

  # Add a campaign feed that associates the feed with this campaign for the
  # AFFILIATE_LOCATION placeholder type.
  my $campaign_feed = Google::Ads::GoogleAds::V13::Resources::CampaignFeed->new(
    {
      feed             => $feed_resource_name,
      placeholderTypes => AFFILIATE_LOCATION,
      matchingFunction =>
        Google::Ads::GoogleAds::V13::Common::MatchingFunction->new({
          functionString => $matching_function
        }
        ),
      campaign => Google::Ads::GoogleAds::V13::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      )});

  # Create the campaign feed operation.
  my $operation =
    Google::Ads::GoogleAds::V13::Services::CampaignFeedService::CampaignFeedOperation
    ->new({
      create => $campaign_feed
    });

  # Issue a mutate request to add the campaign feed and print some information.
  my $response = $api_client->CampaignFeedService()->mutate({
      customerId => $customer_id,
      operations => [$operation]});

  printf
    "Campaign feed created with resource name: '%s'.\n",
    $response->{results}[0]{resourceName};
}
      

フィード属性 ID は、次のようにフィードの FeedMapping から取得できます。

Java

private long getAttributeIdForChainId(FeedMapping feedMapping) {
  Optional<AttributeFieldMapping> fieldMapping =
      feedMapping.getAttributeFieldMappingsList().stream()
          .filter(
              m -> m.getAffiliateLocationField() == AffiliateLocationPlaceholderField.CHAIN_ID)
          .findFirst();
  if (!fieldMapping.isPresent()) {
    throw new RuntimeException("Affiliate location field mapping isn't setup correctly");
  }
  return fieldMapping.get().getFeedAttributeId();
}
      

C#

public static long GetAttributeIdForChainId(FeedMapping feedMapping)
{
    foreach (AttributeFieldMapping fieldMapping in feedMapping.AttributeFieldMappings)
    {
        if (fieldMapping.AffiliateLocationField ==
            AffiliateLocationPlaceholderField.ChainId)
        {
            return fieldMapping.FeedAttributeId;
        }
    }
    throw new ArgumentException("Affiliate location feed mapping isn't setup correctly.");
}
      

PHP

private static function getAttributeIdForChainId(FeedMapping $feedMapping): int
{
    foreach ($feedMapping->getAttributeFieldMappings() as $fieldMapping) {
        /** @var AttributeFieldMapping $fieldMapping */
        if (
            $fieldMapping->getAffiliateLocationField()
            === AffiliateLocationPlaceholderField::CHAIN_ID
        ) {
            return $fieldMapping->getFeedAttributeId();
        }
    }

    throw new RuntimeException(
        "Affiliate location feed mapping isn't setup correctly." . PHP_EOL
    );
}
      

Python

def get_attribute_id_for_chain_id(client, feed_mapping):
    """Gets the feed attribute ID for the retail chain ID.

    Args:
        client: The Google Ads API client.
        feed_mapping: The FeedMapping in which to search.
    Returns:
        The feed attribute ID.
    Raises:
        Exception: If no AffiliateLocationField with a retail chain ID is found
            in the FeedMapping.
    """
    for field_mapping in feed_mapping.attribute_field_mappings:
        if (
            field_mapping.affiliate_location_field
            == client.enums.AffiliateLocationPlaceholderFieldEnum.CHAIN_ID
        ):
            return field_mapping.feed_attribute_id

    raise Exception(
        "No AffiliateLocationField with a retail chain ID was "
        "found in the FeedMapping."
    )
      

Ruby

def get_attribute_id_for_chain_id(feed_mapping)
  feed_mapping.attribute_field_mappings.each do |fm|
    if fm.affiliate_location_field == :CHAIN_ID
      return fm.feed_attribute_id
    end
  end

  raise "Affiliate location feed mapping isn't setup correctly."
end
      

Perl

sub get_attribute_id_for_chain_id {
  my ($feed_mapping) = @_;

  foreach my $field_mapping (@{$feed_mapping->{attributeFieldMappings}}) {
    if ($field_mapping->{affiliateLocationField} eq CHAIN_ID) {
      return $field_mapping->{feedAttributeId};
    }
  }

  die "Affiliate location feed mapping isn't setup correctly.";
}