공유 조합

공유 세트를 사용하면 여러 리소스에서 단일 기준 세트를 관리하고 공유할 수 있습니다. 공유 세트의 유형에 따라 기준은 캠페인, 광고 그룹 또는 계정 수준에서 적용할 수 있습니다.

SharedSetType enum은 Google Ads API에서 사용할 수 있는 공유 세트의 유형을 지정합니다. 이 가이드에서는 공유 세트를 사용하여 공유 제외 키워드 목록을 만들어 캠페인에 적용하는 방법을 설명합니다. 동일한 프로세스를 따라 다른 유형의 공유 세트를 캠페인에 추가할 수 있습니다.

SharedSet를 만드는 방법

먼저 공유 기준의 컨테이너 역할을 하는 SharedSet를 만듭니다.

SharedSet을 만들 때 SharedSetType을 지정합니다. 캠페인 수준 제외 키워드 목록의 경우 NEGATIVE_KEYWORDS을 사용합니다.

기타 유형은 다음과 같습니다.

SharedSet 생성 프로세스에는 다음 단계가 포함됩니다.

  1. SharedSet을 인스턴스화합니다.
  2. SharedSetTypeNEGATIVE_KEYWORDS로 설정합니다.
  3. 향후 리소스 식별을 지원하기 위해 name를 제공합니다.
  4. SharedSetService를 사용하여 SharedSet를 만듭니다.

응답은 새로 생성된 SharedSet의 리소스 이름을 제공합니다. 다음 단계에서 이 이름을 사용합니다.

SharedCriterion 리소스 만들기

다음으로 SharedSet에 추가할 각 항목에 대해 SharedCriterion 리소스를 만듭니다. 제외 키워드 목록의 경우 제외 키워드입니다.

SharedCriterion에는 다음이 포함됩니다.

  • 지원되는 Criterion 객체
  • 이전 단계에서 만든 SharedSet의 리소스 이름입니다.

SharedSet에 제외 키워드를 추가하려면 다음 단계를 따르세요.

  1. 각 제외 키워드에 대해 SharedCriterion 객체를 만듭니다.
  2. SharedCriterion 내에서 KeywordInfo 객체를 만들고 키워드 텍스트와 검색 유형을 설정합니다.
  3. SharedCriterionshared_set 필드를 SharedSet의 리소스 이름으로 설정합니다.
  4. SharedCriterionService을 사용하여 각 SharedCriterionSharedSet에 추가합니다.

SharedSet 첨부

SharedSetSharedCriterion 리소스가 채워지면 계정의 다른 리소스와 연결할 수 있습니다. SharedSet를 연결하는 데 사용하는 리소스는 유형과 기준을 적용하려는 수준에 따라 다릅니다.

AssetSetSharedSet과 다른 리소스 유형이므로 혼동해서는 안 됩니다. 이미지나 동영상과 같은 애셋을 그룹화하거나 실적 최대화 캠페인에서 위치 그룹과 같은 기능을 사용하려면 애셋 세트를 참고하세요.

캠페인 수준

공유 설정 유형에 따라 CampaignSharedSet 또는 CampaignCriterion를 사용하여 캠페인 수준에서 공유 설정을 연결할 수 있습니다.

CampaignSharedSet

NEGATIVE_KEYWORDS 또는 NEGATIVE_PLACEMENTS 유형의 공유 세트는 CampaignSharedSet 리소스를 사용하여 캠페인에 연결해야 합니다. 캠페인 수준에서 연결된 제외 기준은 해당 캠페인 내 모든 광고 그룹에 자동으로 적용됩니다.

SharedSet을 캠페인에 제외 기준으로 연결하려면 다음 단계를 따르세요.

  1. CampaignSharedSet 객체를 만듭니다.
  2. campaign 필드를 SharedSet을 추가하려는 캠페인의 리소스 이름으로 설정합니다.
  3. shared_set 필드를 생성한 SharedSet의 리소스 이름으로 설정합니다.
  4. CampaignSharedSetService를 사용하여 CampaignSharedSet를 만듭니다. 이렇게 하면 캠페인과 SharedSet 간의 연결이 설정됩니다.

CampaignCriterion

BRANDS 유형의 공유 세트는 CampaignCriterion를 사용하여 캠페인에 연결할 수 있습니다.

BRANDS 공유 조합을 캠페인에 연결하려면 다음 단계를 따르세요.

  1. CampaignCriterion를 만듭니다.
  2. brand_list 필드를 BrandListInfo 객체로 설정합니다.
  3. BrandListInfo.shared_setBRANDS SharedSet의 리소스 이름으로 설정합니다.
  4. CampaignCriterionService을 사용하여 CampaignCriterion을 만듭니다.

광고그룹 수준

BRANDS 또는 VERTICAL_ADS_ITEM_GROUP_RULE_LIST 유형의 공유 세트는 AdGroupCriterion을 사용하여 광고 그룹 수준에서 연결할 수 있습니다.

BRANDS 공유 세트를 광고 그룹에 추가하려면 다음 단계를 따르세요.

  1. AdGroupCriterion을 만듭니다.
  2. brand_list 필드를 BrandListInfo 객체로 설정합니다.
  3. BrandListInfo.shared_setBRANDS SharedSet의 리소스 이름으로 설정합니다.
  4. AdGroupCriterionService을 사용하여 AdGroupCriterion을 만듭니다.

VERTICAL_ADS_ITEM_GROUP_RULE_LIST 공유 세트를 광고 그룹에 추가하려면 다음 단계를 따르세요.

  1. AdGroupCriterion을 만듭니다.
  2. vertical_ads_item_group_rule_list 필드를 VerticalAdsItemGroupRuleListInfo 객체로 설정합니다.
  3. VerticalAdsItemGroupRuleListInfo.shared_setVERTICAL_ADS_ITEM_GROUP_RULE_LIST SharedSet의 리소스 이름으로 설정합니다.
  4. AdGroupCriterionService을 사용하여 AdGroupCriterion을 만듭니다.

계정 수준

관리자 계정을 사용하는 경우 SharedSet 리소스를 만들어 계정 계층 구조에 속한 고객 계정과 공유할 수 있습니다.

예를 들어 관리자 계정의 NEGATIVE_PLACEMENTS SharedSet을 고객 계정에 연결하려면 CustomerNegativeCriterion을 사용합니다.

  1. 클라이언트 계정에서 CustomerNegativeCriterion 객체를 만듭니다.
  2. placement_list 필드를 PlacementListInfo 객체로 설정합니다. 여기서 PlacementListInfo.shared_set은 관리자 계정의 SharedSet 리소스 이름으로 설정됩니다.
  3. CustomerNegativeCriterionService를 사용하여 CustomerNegativeCriterion를 만듭니다.

마찬가지로 관리자 계정의 ACCOUNT_LEVEL_NEGATIVE_KEYWORDS SharedSet을 고객 계정에 연결할 수 있습니다.

  1. 클라이언트 계정에서 CustomerNegativeCriterion 객체를 만듭니다.
  2. negative_keyword_list 필드를 NegativeKeywordListInfo 객체로 설정합니다. 여기서 NegativeKeywordListInfo.shared_set은 관리자 계정의 SharedSet 리소스 이름으로 설정됩니다.
  3. CustomerNegativeCriterionService를 사용하여 CustomerNegativeCriterion를 만듭니다.

공유 키워드 세트 코드 예

자바

// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.ads.googleads.examples.advancedoperations;

import static com.google.ads.googleads.examples.utils.CodeSampleHelper.getPrintableDateTime;

import com.beust.jcommander.Parameter;
import com.google.ads.googleads.examples.utils.ArgumentNames;
import com.google.ads.googleads.examples.utils.CodeSampleParams;
import com.google.ads.googleads.lib.GoogleAdsClient;
import com.google.ads.googleads.v23.common.KeywordInfo;
import com.google.ads.googleads.v23.enums.KeywordMatchTypeEnum.KeywordMatchType;
import com.google.ads.googleads.v23.enums.SharedSetTypeEnum.SharedSetType;
import com.google.ads.googleads.v23.errors.GoogleAdsError;
import com.google.ads.googleads.v23.errors.GoogleAdsException;
import com.google.ads.googleads.v23.resources.CampaignSharedSet;
import com.google.ads.googleads.v23.resources.SharedCriterion;
import com.google.ads.googleads.v23.resources.SharedSet;
import com.google.ads.googleads.v23.services.CampaignSharedSetOperation;
import com.google.ads.googleads.v23.services.CampaignSharedSetServiceClient;
import com.google.ads.googleads.v23.services.MutateCampaignSharedSetsResponse;
import com.google.ads.googleads.v23.services.MutateSharedCriteriaResponse;
import com.google.ads.googleads.v23.services.MutateSharedCriterionResult;
import com.google.ads.googleads.v23.services.MutateSharedSetsResponse;
import com.google.ads.googleads.v23.services.SharedCriterionOperation;
import com.google.ads.googleads.v23.services.SharedCriterionServiceClient;
import com.google.ads.googleads.v23.services.SharedSetOperation;
import com.google.ads.googleads.v23.services.SharedSetServiceClient;
import com.google.ads.googleads.v23.utils.ResourceNames;
import com.google.common.collect.ImmutableList;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/** Creates a shared list of negative broad match keywords. It then attaches them to a campaign. */
public class CreateAndAttachSharedKeywordSet {

  private static class CreateAndAttachSharedKeywordSetParams extends CodeSampleParams {

    @Parameter(names = ArgumentNames.CUSTOMER_ID, required = true)
    private Long customerId;

    @Parameter(names = ArgumentNames.CAMPAIGN_ID, required = true)
    private Long campaignId;
  }

  public static void main(String[] args) throws IOException {
    CreateAndAttachSharedKeywordSetParams params = new CreateAndAttachSharedKeywordSetParams();
    if (!params.parseArguments(args)) {

      // Either pass the required parameters for this example on the command line, or insert them
      // into the code here. See the parameter class definition above for descriptions.
      params.customerId = Long.parseLong("INSERT_CUSTOMER_ID_HERE");
      params.campaignId = Long.parseLong("INSERT_CAMPAIGN_ID_HERE");
    }

    GoogleAdsClient googleAdsClient = null;
    try {
      googleAdsClient = GoogleAdsClient.newBuilder().fromPropertiesFile().build();
    } catch (FileNotFoundException fnfe) {
      System.err.printf(
          "Failed to load GoogleAdsClient configuration from file. Exception: %s%n", fnfe);
      System.exit(1);
    } catch (IOException ioe) {
      System.err.printf("Failed to create GoogleAdsClient. Exception: %s%n", ioe);
      System.exit(1);
    }

    try {
      new CreateAndAttachSharedKeywordSet()
          .runExample(googleAdsClient, params.customerId, params.campaignId);
    } catch (GoogleAdsException gae) {
      // GoogleAdsException is the base class for most exceptions thrown by an API request.
      // Instances of this exception have a message and a GoogleAdsFailure that contains a
      // collection of GoogleAdsErrors that indicate the underlying causes of the
      // GoogleAdsException.
      System.err.printf(
          "Request ID %s failed due to GoogleAdsException. Underlying errors:%n",
          gae.getRequestId());
      int i = 0;
      for (GoogleAdsError googleAdsError : gae.getGoogleAdsFailure().getErrorsList()) {
        System.err.printf("  Error %d: %s%n", i++, googleAdsError);
      }
      System.exit(1);
    }
  }

  /**
   * Runs the example.
   *
   * @param googleAdsClient the Google Ads API client.
   * @param customerId the client customer ID.
   * @param campaignId the campaign ID.
   * @throws GoogleAdsException if an API request failed with one or more service errors.
   */
  private void runExample(GoogleAdsClient googleAdsClient, long customerId, long campaignId) {

    // Creates a keywords list to create a shared set of.
    List<String> keywords = Arrays.asList("mars cruise", "mars hotels");

    // Creates shared negative keyword set.
    SharedSet sharedSet =
        SharedSet.newBuilder()
            .setName("API Negative keyword list - " + getPrintableDateTime())
            .setType(SharedSetType.NEGATIVE_KEYWORDS)
            .build();

    SharedSetOperation operation = SharedSetOperation.newBuilder().setCreate(sharedSet).build();

    String sharedSetResourceName;
    try (SharedSetServiceClient sharedSetServiceClient =
        googleAdsClient.getLatestVersion().createSharedSetServiceClient()) {
      MutateSharedSetsResponse response =
          sharedSetServiceClient.mutateSharedSets(
              Long.toString(customerId), ImmutableList.of(operation));
      sharedSetResourceName = response.getResults(0).getResourceName();
      System.out.printf("Created shared set %s%n", sharedSetResourceName);
    }

    List<SharedCriterionOperation> sharedCriterionOperations = new ArrayList<>();
    for (String keyword : keywords) {
      SharedCriterion sharedCriterion =
          SharedCriterion.newBuilder()
              .setKeyword(
                  KeywordInfo.newBuilder()
                      .setText(keyword)
                      .setMatchType(KeywordMatchType.BROAD)
                      .build())
              .setSharedSet(sharedSetResourceName)
              .build();

      SharedCriterionOperation sharedCriterionOperation =
          SharedCriterionOperation.newBuilder().setCreate(sharedCriterion).build();
      sharedCriterionOperations.add(sharedCriterionOperation);
    }

    try (SharedCriterionServiceClient sharedCriterionServiceClient =
        googleAdsClient.getLatestVersion().createSharedCriterionServiceClient()) {
      MutateSharedCriteriaResponse response =
          sharedCriterionServiceClient.mutateSharedCriteria(
              Long.toString(customerId), sharedCriterionOperations);
      System.out.printf("Added %d shared criteria:%n", response.getResultsCount());
      for (MutateSharedCriterionResult result : response.getResultsList()) {
        System.out.printf("\t%s%n", result.getResourceName());
      }
    }

    String campaignResourceName = ResourceNames.campaign(customerId, campaignId);
    CampaignSharedSet campaignSharedSet =
        CampaignSharedSet.newBuilder()
            .setCampaign(campaignResourceName)
            .setSharedSet(sharedSetResourceName)
            .build();

    CampaignSharedSetOperation campaignSharedSetOperation =
        CampaignSharedSetOperation.newBuilder().setCreate(campaignSharedSet).build();

    try (CampaignSharedSetServiceClient campaignSharedSetServiceClient =
        googleAdsClient.getLatestVersion().createCampaignSharedSetServiceClient()) {
      MutateCampaignSharedSetsResponse response =
          campaignSharedSetServiceClient.mutateCampaignSharedSets(
              Long.toString(customerId), ImmutableList.of(campaignSharedSetOperation));
      String campaignSharedSetResourceName = response.getResults(0).getResourceName();
      System.out.printf("Created campaign shared set %s%n", campaignSharedSetResourceName);
    }
  }
}

      

C#

// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using CommandLine;
using Google.Ads.Gax.Examples;
using Google.Ads.GoogleAds.Lib;
using Google.Ads.GoogleAds.V23.Common;
using Google.Ads.GoogleAds.V23.Errors;
using Google.Ads.GoogleAds.V23.Resources;
using Google.Ads.GoogleAds.V23.Services;
using System;
using System.Collections.Generic;
using static Google.Ads.GoogleAds.V23.Enums.KeywordMatchTypeEnum.Types;
using static Google.Ads.GoogleAds.V23.Enums.SharedSetTypeEnum.Types;

namespace Google.Ads.GoogleAds.Examples.V23
{
    /// <summary>
    /// This code example creates a shared list of negative broad match keywords. It then
    /// attaches them to a campaign.
    /// </summary>
    public class CreateAndAttachSharedKeywordSet : ExampleBase
    {
        /// <summary>
        /// Command line options for running the <see cref="CreateAndAttachSharedKeywordSet"/>
        /// example.
        /// </summary>
        public class Options : OptionsBase
        {
            /// <summary>
            /// The Google Ads customer ID for which the call is made.
            /// </summary>
            [Option("customerId", Required = true, HelpText =
                "The Google Ads customer ID for which the call is made.")]
            public long CustomerId { get; set; }

            /// <summary>
            /// The ID of the campaign for which shared criterion is updated.
            /// </summary>
            [Option("campaignId", Required = true, HelpText =
                "The ID of the campaign for which shared criterion is updated.")]
            public long CampaignId { get; set; }
        }

        /// <summary>
        /// Main method, to run this code example as a standalone application.
        /// </summary>
        /// <param name="args">The command line arguments.</param>
        public static void Main(string[] args)
        {
            Options options = ExampleUtilities.ParseCommandLine<Options>(args);

            CreateAndAttachSharedKeywordSet codeExample = new CreateAndAttachSharedKeywordSet();
            Console.WriteLine(codeExample.Description);
            codeExample.Run(new GoogleAdsClient(), options.CustomerId, options.CampaignId);
        }

        /// <summary>
        /// Returns a description about the code example.
        /// </summary>
        public override string Description =>
            "This code example creates a shared list of negative broad match keywords. It then " +
            "attaches them to a campaign.";

        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="client">The Google Ads client.</param>
        /// <param name="customerId">The Google Ads customer ID for which the call is made.</param>
        /// <param name="campaignId">The ID of the campaign for which shared criterion is updated.
        /// </param>
        public void Run(GoogleAdsClient client, long customerId, long campaignId)
        {
            SharedSetServiceClient sharedSetService = client.GetService(
                Services.V23.SharedSetService);
            SharedCriterionServiceClient sharedCriterionService =
                client.GetService(Services.V23.SharedCriterionService);
            CampaignSharedSetServiceClient campaignSharedSetService =
                client.GetService(Services.V23.CampaignSharedSetService);

            try
            {
                // Keywords to create a shared set of.
                string[] keywords = new string[] { "mars cruise", "mars hotels" };

                // Create shared negative keyword set.
                SharedSet sharedSet = new SharedSet()
                {
                    Name = "API Negative keyword list - " + ExampleUtilities.GetRandomString(),
                    Type = SharedSetType.NegativeKeywords,
                };
                SharedSetOperation operation = new SharedSetOperation()
                {
                    Create = sharedSet
                };

                MutateSharedSetsResponse sharedSetResponse = sharedSetService.MutateSharedSets(
                    customerId.ToString(), new SharedSetOperation[] { operation });

                string sharedSetResourceName = sharedSetResponse.Results[0].ResourceName;
                Console.WriteLine($"Created shared set {sharedSetResourceName}.");

                // Create negative keywords in the shared set.
                List<SharedCriterionOperation> criterionOperations =
                    new List<SharedCriterionOperation>();

                foreach (string keyword in keywords)
                {
                    SharedCriterion sharedCriterion = new SharedCriterion()
                    {
                        Keyword = new KeywordInfo()
                        {
                            Text = keyword,
                            MatchType = KeywordMatchType.Broad
                        },
                        SharedSet = sharedSetResourceName
                    };
                    criterionOperations.Add(new SharedCriterionOperation()
                    {
                        Create = sharedCriterion
                    });
                }

                MutateSharedCriteriaResponse criteriaResponse =
                    sharedCriterionService.MutateSharedCriteria(
                        customerId.ToString(), criterionOperations);

                foreach (MutateSharedCriterionResult result in criteriaResponse.Results)
                {
                    Console.WriteLine($"Created shared criterion {result.ResourceName}.");
                }

                // Attach shared set to campaign.
                CampaignSharedSet campaignSet = new CampaignSharedSet()
                {
                    Campaign = ResourceNames.Campaign(customerId, campaignId),
                    SharedSet = sharedSetResourceName
                };

                CampaignSharedSetOperation sharedSetoperation = new CampaignSharedSetOperation()
                {
                    Create = campaignSet
                };
                MutateCampaignSharedSetsResponse response =
                    campaignSharedSetService.MutateCampaignSharedSets(customerId.ToString(),
                        new CampaignSharedSetOperation[] { sharedSetoperation });

                Console.WriteLine("Created campaign shared set {0}.",
                    response.Results[0].ResourceName);
            }
            catch (GoogleAdsException e)
            {
                Console.WriteLine("Failure:");
                Console.WriteLine($"Message: {e.Message}");
                Console.WriteLine($"Failure: {e.Failure}");
                Console.WriteLine($"Request ID: {e.RequestId}");
                throw;
            }
        }
    }
}

      

PHP

<?php

/**
 * Copyright 2018 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace Google\Ads\GoogleAds\Examples\AdvancedOperations;

require __DIR__ . '/../../vendor/autoload.php';

use GetOpt\GetOpt;
use Google\Ads\GoogleAds\Examples\Utils\ArgumentNames;
use Google\Ads\GoogleAds\Examples\Utils\ArgumentParser;
use Google\Ads\GoogleAds\Examples\Utils\Helper;
use Google\Ads\GoogleAds\Lib\V23\GoogleAdsClient;
use Google\Ads\GoogleAds\Lib\V23\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Lib\V23\GoogleAdsException;
use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder;
use Google\Ads\GoogleAds\Util\V23\ResourceNames;
use Google\Ads\GoogleAds\V23\Common\KeywordInfo;
use Google\Ads\GoogleAds\V23\Enums\KeywordMatchTypeEnum\KeywordMatchType;
use Google\Ads\GoogleAds\V23\Enums\SharedSetTypeEnum\SharedSetType;
use Google\Ads\GoogleAds\V23\Errors\GoogleAdsError;
use Google\Ads\GoogleAds\V23\Resources\CampaignSharedSet;
use Google\Ads\GoogleAds\V23\Resources\SharedCriterion;
use Google\Ads\GoogleAds\V23\Resources\SharedSet;
use Google\Ads\GoogleAds\V23\Services\CampaignSharedSetOperation;
use Google\Ads\GoogleAds\V23\Services\MutateCampaignSharedSetsRequest;
use Google\Ads\GoogleAds\V23\Services\MutateSharedCriteriaRequest;
use Google\Ads\GoogleAds\V23\Services\MutateSharedSetsRequest;
use Google\Ads\GoogleAds\V23\Services\SharedCriterionOperation;
use Google\Ads\GoogleAds\V23\Services\SharedSetOperation;
use Google\ApiCore\ApiException;

/**
 * This example creates a shared list of negative broad match keywords. It then attaches them to a
 * campaign.
 */
class CreateAndAttachSharedKeywordSet
{
    private const CUSTOMER_ID = 'INSERT_CUSTOMER_ID_HERE';
    private const CAMPAIGN_ID = 'INSERT_CAMPAIGN_ID_HERE';

    public static function main()
    {
        // Either pass the required parameters for this example on the command line, or insert them
        // into the constants above.
        $options = (new ArgumentParser())->parseCommandArguments([
            ArgumentNames::CUSTOMER_ID => GetOpt::REQUIRED_ARGUMENT,
            ArgumentNames::CAMPAIGN_ID => GetOpt::REQUIRED_ARGUMENT
        ]);

        // Generate a refreshable OAuth2 credential for authentication.
        $oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build();

        // Construct a Google Ads client configured from a properties file and the
        // OAuth2 credentials above.
        $googleAdsClient = (new GoogleAdsClientBuilder())->fromFile()
            ->withOAuth2Credential($oAuth2Credential)
            ->build();

        try {
            self::runExample(
                $googleAdsClient,
                $options[ArgumentNames::CUSTOMER_ID] ?: self::CUSTOMER_ID,
                $options[ArgumentNames::CAMPAIGN_ID] ?: self::CAMPAIGN_ID
            );
        } catch (GoogleAdsException $googleAdsException) {
            printf(
                "Request with ID '%s' has failed.%sGoogle Ads failure details:%s",
                $googleAdsException->getRequestId(),
                PHP_EOL,
                PHP_EOL
            );
            foreach ($googleAdsException->getGoogleAdsFailure()->getErrors() as $error) {
                /** @var GoogleAdsError $error */
                printf(
                    "\t%s: %s%s",
                    $error->getErrorCode()->getErrorCode(),
                    $error->getMessage(),
                    PHP_EOL
                );
            }
            exit(1);
        } catch (ApiException $apiException) {
            printf(
                "ApiException was thrown with message '%s'.%s",
                $apiException->getMessage(),
                PHP_EOL
            );
            exit(1);
        }
    }

    /**
     * Runs the example.
     *
     * @param GoogleAdsClient $googleAdsClient the Google Ads API client
     * @param int $customerId the customer ID
     * @param int $campaignId the ID of the campaign
     */
    public static function runExample(
        GoogleAdsClient $googleAdsClient,
        int $customerId,
        int $campaignId
    ) {
        // Create shared negative keyword set.
        $sharedSet = new SharedSet([
            'name' => 'API Negative keyword list - ' . Helper::getPrintableDatetime(),
            'type' => SharedSetType::NEGATIVE_KEYWORDS,
        ]);

        $sharedSetOperation = new SharedSetOperation();
        $sharedSetOperation->setCreate($sharedSet);

        $sharedSetServiceClient = $googleAdsClient->getSharedSetServiceClient();
        $response = $sharedSetServiceClient->mutateSharedSets(MutateSharedSetsRequest::build(
            $customerId,
            [$sharedSetOperation]
        ));

        $sharedSetResourceName = $response->getResults()[0]->getResourceName();
        print 'Created shared set ' . $sharedSetResourceName . PHP_EOL;

        // Creates shared set criteria.
        $sharedCriterionOperations = [];
        // Keywords to create a shared set of.
        $keywords = ['mars cruise', 'mars hotels'];
        foreach ($keywords as $keyword) {
            $sharedCriterion = new SharedCriterion([
                'keyword' => new KeywordInfo([
                    'text' => $keyword,
                    'match_type' => KeywordMatchType::BROAD
                ]),
                'shared_set' => $sharedSetResourceName
            ]);

            $sharedCriterionOperation = new SharedCriterionOperation();
            $sharedCriterionOperation->setCreate($sharedCriterion);
            $sharedCriterionOperations[] = $sharedCriterionOperation;
        }

        $sharedCriterionServiceClient = $googleAdsClient->getSharedCriterionServiceClient();
        $response = $sharedCriterionServiceClient->mutateSharedCriteria(
            MutateSharedCriteriaRequest::build($customerId, $sharedCriterionOperations)
        );

        printf("Added %d shared criteria:%s", $response->getResults()->count(), PHP_EOL);
        foreach ($response->getResults() as $addedSharedCriterion) {
            /** @var SharedCriterion $addedSharedCriterion */
            print "\t" . $addedSharedCriterion->getResourceName() . PHP_EOL;
        }

        // Creates campaign shared set.
        $campaignSharedSet = new CampaignSharedSet([
            'campaign' => ResourceNames::forCampaign($customerId, $campaignId),
            'shared_set' => $sharedSetResourceName
        ]);

        $campaignSharedSetOperation = new CampaignSharedSetOperation();
        $campaignSharedSetOperation->setCreate($campaignSharedSet);

        $campaignSharedSetServiceClient = $googleAdsClient->getCampaignSharedSetServiceClient();
        $response = $campaignSharedSetServiceClient->mutateCampaignSharedSets(
            MutateCampaignSharedSetsRequest::build($customerId, [$campaignSharedSetOperation])
        );

        print 'Created campaign shared set: ' . $response->getResults()[0]->getResourceName()
            . PHP_EOL;
    }
}

CreateAndAttachSharedKeywordSet::main();

      

Python

#!/usr/bin/env python
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Demonstrates how to create a shared list of negative broad match keywords.

Note that the keywords will be attached to the specified campaign.
"""


import argparse
import sys
from typing import List
import uuid

from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
from google.ads.googleads.v23.errors.types.errors import GoogleAdsError
from google.ads.googleads.v23.resources.types.campaign_shared_set import (
    CampaignSharedSet,
)
from google.ads.googleads.v23.resources.types.shared_criterion import (
    SharedCriterion,
)
from google.ads.googleads.v23.resources.types.shared_set import SharedSet
from google.ads.googleads.v23.services.services.campaign_service import (
    CampaignServiceClient,
)
from google.ads.googleads.v23.services.services.campaign_shared_set_service import (
    CampaignSharedSetServiceClient,
)
from google.ads.googleads.v23.services.types.campaign_shared_set_service import (
    CampaignSharedSetOperation,
    MutateCampaignSharedSetsResponse,
)
from google.ads.googleads.v23.services.services.shared_criterion_service import (
    SharedCriterionServiceClient,
)
from google.ads.googleads.v23.services.services.shared_set_service import (
    SharedSetServiceClient,
)
from google.ads.googleads.v23.services.types.shared_criterion_service import (
    MutateSharedCriteriaResponse,
    MutateSharedCriterionResult,
    SharedCriterionOperation,
)
from google.ads.googleads.v23.services.types.shared_set_service import (
    MutateSharedSetsResponse,
    SharedSetOperation,
)


def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None:
    campaign_service: CampaignServiceClient = client.get_service(
        "CampaignService"
    )
    shared_set_service: SharedSetServiceClient = client.get_service(
        "SharedSetService"
    )
    shared_criterion_service: SharedCriterionServiceClient = client.get_service(
        "SharedCriterionService"
    )
    campaign_shared_set_service: CampaignSharedSetServiceClient = (
        client.get_service("CampaignSharedSetService")
    )

    # Create shared negative keyword set.
    shared_set_operation: SharedSetOperation = client.get_type(
        "SharedSetOperation"
    )
    shared_set: SharedSet = shared_set_operation.create
    shared_set.name = f"API Negative keyword list - {uuid.uuid4()}"
    shared_set.type_ = client.enums.SharedSetTypeEnum.NEGATIVE_KEYWORDS

    try:
        shared_set_response: MutateSharedSetsResponse = (
            shared_set_service.mutate_shared_sets(
                customer_id=customer_id, operations=[shared_set_operation]
            )
        )
        shared_set_resource_name: str = shared_set_response.results[
            0
        ].resource_name

        print(f'Created shared set "{shared_set_resource_name}".')
    except GoogleAdsException as ex:
        handle_googleads_exception(ex)

    # Keywords to create a shared set of.
    keywords: List[str] = ["mars cruise", "mars hotels"]
    shared_criteria_operations: List[SharedCriterionOperation] = []
    for keyword in keywords:
        shared_criterion_operation: SharedCriterionOperation = client.get_type(
            "SharedCriterionOperation"
        )
        shared_criterion: SharedCriterion = shared_criterion_operation.create
        shared_criterion.keyword.text = keyword
        shared_criterion.keyword.match_type = (
            client.enums.KeywordMatchTypeEnum.BROAD
        )
        shared_criterion.shared_set = shared_set_resource_name
        shared_criteria_operations.append(shared_criterion_operation)
    try:
        response: MutateSharedCriteriaResponse = (
            shared_criterion_service.mutate_shared_criteria(
                customer_id=customer_id, operations=shared_criteria_operations
            )
        )

        shared_criterion_result: MutateSharedCriterionResult
        for shared_criterion_result in response.results:
            print(
                "Created shared criterion "
                f'"{shared_criterion_result.resource_name}".'
            )
    except GoogleAdsException as ex:
        handle_googleads_exception(ex)

    campaign_set_operation: CampaignSharedSetOperation = client.get_type(
        "CampaignSharedSetOperation"
    )
    campaign_set: CampaignSharedSet = campaign_set_operation.create
    campaign_set.campaign = campaign_service.campaign_path(
        customer_id, campaign_id
    )
    campaign_set.shared_set = shared_set_resource_name

    try:
        campaign_shared_set_response: MutateCampaignSharedSetsResponse = (
            campaign_shared_set_service.mutate_campaign_shared_sets(
                customer_id=customer_id, operations=[campaign_set_operation]
            )
        )

        print(
            "Created campaign shared set "
            f'"{campaign_shared_set_response.results[0].resource_name}".'
        )
    except GoogleAdsException as ex:
        handle_googleads_exception(ex)


def handle_googleads_exception(exception: GoogleAdsException) -> None:
    print(
        f'Request with ID "{exception.request_id}" failed with status '
        f'"{exception.error.code().name}" and includes the following errors:'
    )
    error: GoogleAdsError
    for error in exception.failure.errors:
        print(f'\tError with message "{error.message}".')
        if error.location:
            for field_path_element in error.location.field_path_elements:
                print(f"\t\tOn field: {field_path_element.field_name}")
    sys.exit(1)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=(
            "Adds a list of negative broad match keywords to the "
            "provided campaign, for the specified customer."
        )
    )
    # The following argument(s) should be provided to run the example.
    parser.add_argument(
        "-c",
        "--customer_id",
        type=str,
        required=True,
        help="The Google Ads customer ID.",
    )
    parser.add_argument(
        "-i", "--campaign_id", type=str, required=True, help="The campaign ID."
    )
    args = parser.parse_args()

    # GoogleAdsClient will read the google-ads.yaml configuration file in the
    # home directory if none is specified.
    googleads_client: GoogleAdsClient = GoogleAdsClient.load_from_storage(
        version="v23"
    )

    main(googleads_client, args.customer_id, args.campaign_id)

      

Ruby

#!/usr/bin/env ruby
# Encoding: utf-8
#
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This example creates a shared list of negative broad match keywords. It then
# attaches them to a campaign.

require "optparse"
require "google/ads/google_ads"
require "date"

def create_and_attach_shared_keyword_set(customer_id, campaign_id)
  # GoogleAdsClient will read a config file from
  # ENV['HOME']/google_ads_config.rb when called without parameters

  client = Google::Ads::GoogleAds::GoogleAdsClient.new

  # Keywords to create a shared set of.
  keywords = ["mars cruise", "mars hotels"]

  # Create shared negative keyword set.
  shared_set = client.resource.shared_set do |ss|
    ss.name = "API Negative keyword list - #{(Time.new.to_f * 1000).to_i}"
    ss.type = :NEGATIVE_KEYWORDS
  end

  operation = client.operation.create_resource.shared_set(shared_set)

  response = client.service.shared_set.mutate_shared_sets(
    customer_id: customer_id,
    operations: [operation],
  )

  shared_set_resource_name = response.results.first.resource_name
  puts "Created shared set #{shared_set_resource_name}"

  shared_criteria = keywords.map do |keyword|
    client.resource.shared_criterion do |sc|
      sc.keyword = client.resource.keyword_info do |kw|
        kw.text = keyword
        kw.match_type = :BROAD
      end
      sc.shared_set = shared_set_resource_name
    end
  end

  operations = shared_criteria.map do |criterion|
    client.operation.create_resource.shared_criterion(criterion)
  end

  response = client.service.shared_criterion.mutate_shared_criteria(
    customer_id: customer_id,
    operations: operations,
  )

  response.results.each do |result|
    puts "Created shared criterion #{result.resource_name}"
  end

  campaign_set = client.resource.campaign_shared_set do |css|
    css.campaign = client.path.campaign(customer_id, campaign_id)
    css.shared_set = shared_set_resource_name
  end

  operation = client.operation.create_resource.campaign_shared_set(campaign_set)

  response = client.service.campaign_shared_set.mutate_campaign_shared_sets(
    customer_id: customer_id,
    operations: [operation],
  )

  puts "Created campaign shared set #{response.results.first.resource_name}"
end

if __FILE__ == $PROGRAM_NAME
  options = {}
  # The following parameter(s) should be provided to run the example. You can
  # either specify these by changing the INSERT_XXX_ID_HERE values below, or on
  # the command line.
  #
  # Parameters passed on the command line will override any parameters set in
  # code.
  #
  # Running the example with -h will print the command line usage.
  options[:customer_id] = 'INSERT_CUSTOMER_ID_HERE'
  options[:campaign_id] = 'INSERT_CAMPAIGN_ID_HERE'

  OptionParser.new do |opts|
    opts.banner = sprintf('Usage: ruby %s [options]', File.basename(__FILE__))

    opts.separator ''
    opts.separator 'Options:'

    opts.on('-C', '--customer-id CUSTOMER-ID', String, 'Customer ID') do |v|
      options[:customer_id] = v
    end

    opts.on('-c', '--campaign-id CAMPAIGN-ID', String, 'Campaign ID') do |v|
      options[:campaign_id] = v
    end

    opts.separator ''
    opts.separator 'Help:'

    opts.on_tail('-h', '--help', 'Show this message') do
      puts opts
      exit
    end
  end.parse!

  begin
    create_and_attach_shared_keyword_set(options.fetch(:customer_id).tr("-", ""),
        options[:campaign_id])
  rescue Google::Ads::GoogleAds::Errors::GoogleAdsError => e
    e.failure.errors.each do |error|
      STDERR.printf("Error with message: %s\n", error.message)
      if error.location
        error.location.field_path_elements.each do |field_path_element|
          STDERR.printf("\tOn field: %s\n", field_path_element.field_name)
        end
      end
      error.error_code.to_h.each do |k, v|
        next if v == :UNSPECIFIED
        STDERR.printf("\tType: %s\n\tCode: %s\n", k, v)
      end
    end
    raise
  end
end

      

Perl

#!/usr/bin/perl -w
#
# Copyright 2019, Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This example creates a shared list of negative broad match keywords. It then
# attaches them to a campaign.

use strict;
use warnings;
use utf8;

use FindBin qw($Bin);
use lib "$Bin/../../lib";
use Google::Ads::GoogleAds::Client;
use Google::Ads::GoogleAds::Utils::GoogleAdsHelper;
use Google::Ads::GoogleAds::V23::Resources::SharedSet;
use Google::Ads::GoogleAds::V23::Resources::SharedCriterion;
use Google::Ads::GoogleAds::V23::Resources::CampaignSharedSet;
use Google::Ads::GoogleAds::V23::Common::KeywordInfo;
use Google::Ads::GoogleAds::V23::Enums::SharedSetTypeEnum qw(NEGATIVE_KEYWORDS);
use Google::Ads::GoogleAds::V23::Enums::KeywordMatchTypeEnum qw(BROAD);
use Google::Ads::GoogleAds::V23::Services::SharedSetService::SharedSetOperation;
use
  Google::Ads::GoogleAds::V23::Services::SharedCriterionService::SharedCriterionOperation;
use
  Google::Ads::GoogleAds::V23::Services::CampaignSharedSetService::CampaignSharedSetOperation;
use Google::Ads::GoogleAds::V23::Utils::ResourceNames;

use Getopt::Long qw(:config auto_help);
use Pod::Usage;
use Cwd          qw(abs_path);
use Data::Uniqid qw(uniqid);

# The following parameter(s) should be provided to run the example. You can
# either specify these by changing the INSERT_XXX_ID_HERE values below, or on
# the command line.
#
# Parameters passed on the command line will override any parameters set in
# code.
#
# Running the example with -h will print the command line usage.
my $customer_id = "INSERT_CUSTOMER_ID_HERE";
my $campaign_id = "INSERT_CAMPAIGN_ID_HERE";

sub create_and_attach_shared_keyword_set {
  my ($api_client, $customer_id, $campaign_id) = @_;

  # Create shared negative keyword set.
  my $shared_set = Google::Ads::GoogleAds::V23::Resources::SharedSet->new({
    name => "API Negative keyword list - " . uniqid(),
    type => NEGATIVE_KEYWORDS
  });

  my $shared_set_operation =
    Google::Ads::GoogleAds::V23::Services::SharedSetService::SharedSetOperation
    ->new({
      create => $shared_set
    });

  my $shared_sets_response = $api_client->SharedSetService()->mutate({
      customerId => $customer_id,
      operations => [$shared_set_operation]});

  my $shared_set_resource_name =
    $shared_sets_response->{results}[0]{resourceName};
  printf "Created shared set: '%s'.\n", $shared_set_resource_name;

  # Create shared set criterion.
  my $shared_criterion_operations = [];
  # Keywords to create a shared set of.
  my $keywords = ['mars cruise', 'mars hotels'];
  foreach my $keyword (@$keywords) {
    my $shared_criterion =
      Google::Ads::GoogleAds::V23::Resources::SharedCriterion->new({
        keyword => Google::Ads::GoogleAds::V23::Common::KeywordInfo->new({
            text      => $keyword,
            matchType => BROAD
          }
        ),
        sharedSet => $shared_set_resource_name
      });

    my $shared_criterion_operation =
      Google::Ads::GoogleAds::V23::Services::SharedCriterionService::SharedCriterionOperation
      ->new({
        create => $shared_criterion
      });
    push @$shared_criterion_operations, $shared_criterion_operation;
  }

  my $shared_criteria_response = $api_client->SharedCriterionService()->mutate({
    customerId => $customer_id,
    operations => $shared_criterion_operations
  });

  my $shared_criterion_results = $shared_criteria_response->{results};
  printf "Added %d shared criterion:\n", scalar @$shared_criterion_results;
  foreach my $shared_criterion_result (@$shared_criterion_results) {
    printf "\t%s\n", $shared_criterion_result->{resourceName};
  }

  # Create campaign shared set.
  my $campaign_shared_set =
    Google::Ads::GoogleAds::V23::Resources::CampaignSharedSet->new({
      campaign => Google::Ads::GoogleAds::V23::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      ),
      sharedSet => $shared_set_resource_name
    });

  my $campaign_shared_set_operation =
    Google::Ads::GoogleAds::V23::Services::CampaignSharedSetService::CampaignSharedSetOperation
    ->new({
      create => $campaign_shared_set
    });

  my $campaign_shared_sets_response =
    $api_client->CampaignSharedSetService()->mutate({
      customerId => $customer_id,
      operations => [$campaign_shared_set_operation]});

  printf "Created campaign shared set: '%s'.\n",
    $campaign_shared_sets_response->{results}[0]{resourceName};
  return 1;
}

# Don't run the example if the file is being included.
if (abs_path($0) ne abs_path(__FILE__)) {
  return 1;
}

# Get Google Ads Client, credentials will be read from ~/googleads.properties.
my $api_client = Google::Ads::GoogleAds::Client->new();

# By default examples are set to die on any server returned fault.
$api_client->set_die_on_faults(1);

# Parameters passed on the command line will override any parameters set in code.
GetOptions("customer_id=s" => \$customer_id, "campaign_id=i" => \$campaign_id);

# Print the help message if the parameters are not initialized in the code nor
# in the command line.
pod2usage(2) if not check_params($customer_id, $campaign_id);

# Call the example.
create_and_attach_shared_keyword_set($api_client, $customer_id =~ s/-//gr,
  $campaign_id);

=pod

=head1 NAME

create_and_attach_shared_keyword_set

=head1 DESCRIPTION

This example creates a shared list of negative broad match keywords. It then attaches
them to a campaign.

=head1 SYNOPSIS

create_and_attach_shared_keyword_set.pl [options]

    -help                       Show the help message.
    -customer_id                The Google Ads customer ID.
    -campaign_id                The campaign ID.

=cut