Nhóm được chia sẻ cho phép bạn quản lý và chia sẻ một nhóm tiêu chí duy nhất trên nhiều tài nguyên. Tuỳ thuộc vào loại của nhóm được chia sẻ, bạn có thể áp dụng tiêu chí ở cấp chiến dịch, nhóm quảng cáo hoặc tài khoản.
Enum SharedSetType chỉ định các loại nhóm được chia sẻ mà bạn có thể sử dụng trong API Google Ads. Hướng dẫn này cho biết cách sử dụng một nhóm được chia sẻ để tạo và áp dụng danh sách từ khoá phủ định được chia sẻ cho một chiến dịch. Bạn có thể làm theo quy trình tương tự để thêm các loại nhóm được chia sẻ khác vào chiến dịch.
Tạo một SharedSet
Trước tiên, hãy tạo một SharedSet để đóng vai trò là vùng chứa cho tiêu chí được chia sẻ.
Khi bạn tạo SharedSet, hãy chỉ định SharedSetType.
Đối với danh sách từ khoá phủ định ở cấp chiến dịch, hãy sử dụng NEGATIVE_KEYWORDS (được hỗ trợ trên chiến dịch Tìm kiếm, chiến dịch Hiển thị, chiến dịch Mua sắm, chiến dịch MULTI_CHANNEL Quảng cáo ứng dụng và chiến dịch LOCAL).
Các loại khác bao gồm:
NEGATIVE_PLACEMENTS: Danh sách các vị trí (chẳng hạn như trang web hoặc ứng dụng) cần loại trừ. Bạn có thể đính kèm loại danh sách này vào chiến dịch cóCampaignSharedSethoặc vào tài khoản cóCustomerNegativeCriterion.ACCOUNT_LEVEL_NEGATIVE_KEYWORDS: Danh sách từ khoá phủ định cần loại trừ khỏi tiêu chí nhắm mục tiêu. Bạn phải đính kèm loại danh sách này vào một tài khoản bằng cách sử dụngCustomerNegativeCriterion(bạn có thể đính kèm tối đa mộtACCOUNT_LEVEL_NEGATIVE_KEYWORDSđược chia sẻ cho mỗi tài khoản).BRANDS: Danh sách các thương hiệu (tiêu chíBrandInfotrênSharedCriterion) để sử dụng trong các quy định hạn chế về thương hiệu cho chiến dịch Tìm kiếm hoặc để loại trừ khỏi tiêu chí nhắm mục tiêu.WEBPAGES(chỉ dành cho những tài khoản có trong danh sách cho phép): Một danh sách các điều kiện của trang web (tiêu chíWebpageInfotrênSharedCriterion) để loại trừ khỏi việc nhắm mục tiêu ở cấp chiến dịch bằng cách sử dụngWebpageListInfo(CampaignCriterion.webpage_list).VERTICAL_ADS_ITEM_GROUP_RULE_LIST: Danh sách các quy tắcVerticalAdsItemGroupRuleInfo(SharedCriterion.vertical_ads_item_group_rule) có thể được nhắm mục tiêu hoặc loại trừ (SharedCriterion.negative) trong Quảng cáo dọc, chẳng hạn như chiến dịch Tìm kiếm có nguồn cấp dữ liệu du lịch.- Các phương diện quy tắc được hỗ trợ bao gồm
item_code,country_criterion_id,region_criterion_id,city_criterion_idvàhotel_class. - Trong phiên bản 24 trở lên, các phương diện quy tắc
user_rating,venuevàevent_participant_display_namecũng được hỗ trợ.
- Các phương diện quy tắc được hỗ trợ bao gồm
RETAIL_FILTER(phiên bản 24 trở lên; chỉ những tài khoản trong danh sách cho phép): Một nhóm các quy tắc về thẻ và biểu thứcRetailFilter(SharedCriterion.retail_filter) được dùng để lọc sản phẩm dựa trên thẻ linh động trong chiến dịch Mua sắm và chiến dịch bán lẻ.
Quy trình tạo SharedSet bao gồm các bước sau:
- Tạo thực thể cho
SharedSet. - Đặt
SharedSetTypethànhNEGATIVE_KEYWORDS. - Cung cấp một
nameđể hỗ trợ việc xác định tài nguyên trong tương lai. - Dùng
SharedSetServiceđể tạoSharedSet.
Phản hồi cung cấp tên tài nguyên của SharedSet mới tạo. Bạn sẽ dùng tên này trong các bước tiếp theo.
Tạo tài nguyên SharedCriterion
Tiếp theo, hãy tạo tài nguyên SharedCriterion cho từng mục mà bạn muốn thêm vào SharedSet. Trong trường hợp danh sách từ khoá phủ định, đây là các từ khoá phủ định của bạn.
Mỗi SharedCriterion đều chứa:
- Một đối tượng
Criterionđược hỗ trợ. - Tên tài nguyên của
SharedSetmà bạn đã tạo ở bước trước.
Cách thêm từ khoá phủ định vào SharedSet:
- Đối với mỗi từ khoá phủ định, hãy tạo một đối tượng
SharedCriterion. - Trong mỗi
SharedCriterion, hãy tạo một đối tượngKeywordInfovà đặt văn bản từ khoá cũng như kiểu khớp. - Đặt trường
shared_setcủaSharedCriterionthành tên tài nguyên củaSharedSet. - Kết hợp các đối tượng
SharedCriterionOperationthành một yêu cầu duy nhất và sử dụngSharedCriterionService.MutateSharedCriteriađể thêm các đối tượng đó theo lô thay vì gửi các yêu cầu riêng biệt cho từng tiêu chí.
Đính kèm SharedSet
Sau khi SharedSet được điền sẵn bằng các tài nguyên SharedCriterion, bạn có thể
liên kết đó với các tài nguyên khác trong tài khoản của mình. Tài nguyên mà bạn dùng để đính kèm một SharedSet phụ thuộc vào loại tài nguyên đó và cấp độ mà bạn muốn áp dụng tiêu chí của tài nguyên.
Cấp chiến dịch
Bạn có thể đính kèm các nhóm được chia sẻ ở cấp chiến dịch bằng cách sử dụng CampaignSharedSet hoặc CampaignCriterion, tuỳ thuộc vào loại nhóm được chia sẻ.
CampaignSharedSet- Các nhóm được chia sẻ thuộc loại
NEGATIVE_KEYWORDShoặcNEGATIVE_PLACEMENTSphải được đính kèm vào các chiến dịch bằng cách sử dụng tài nguyênCampaignSharedSet. Tiêu chí phủ định được đính kèm ở cấp chiến dịch sẽ tự động áp dụng cho tất cả nhóm quảng cáo trong chiến dịch đó. Cách liên kết mộtSharedSetvới chiến dịch dưới dạng tiêu chí phủ định:
- Tạo một đối tượng
CampaignSharedSet. - Đặt trường
campaignthành tên tài nguyên của chiến dịch mà bạn muốn thêmSharedSetvào. - Đặt trường
shared_setthành tên tài nguyên củaSharedSetmà bạn đã tạo. - Dùng
CampaignSharedSetServiceđể tạoCampaignSharedSet. Thao tác này sẽ thiết lập mối liên kết giữa chiến dịch vàSharedSet.
CampaignCriterion- Bạn có thể đính kèm các nhóm được chia sẻ thuộc loại
BRANDShoặcWEBPAGES(chỉ dành cho những tài khoản trong danh sách cho phép) vào chiến dịch bằng cách sử dụngCampaignCriterion(bằng cách đặtbrand_listthành đối tượngBrandListInfohoặcwebpage_listthành đối tượngWebpageListInfo). Cách đính kèm mộtBRANDSnhóm được chia sẻ vào một chiến dịch:
- Tạo
CampaignCriterion. - Đặt trường
brand_listthành đối tượngBrandListInfo. - Đặt
BrandListInfo.shared_setthành tên tài nguyên củaBRANDSSharedSet. - Dùng
CampaignCriterionServiceđể tạoCampaignCriterion.
Cấp nhóm quảng cáo
Bạn có thể đính kèm các nhóm được chia sẻ thuộc loại BRANDS, VERTICAL_ADS_ITEM_GROUP_RULE_LIST hoặc RETAIL_FILTER (phiên bản 24 trở lên, chỉ những tài khoản trong danh sách cho phép) ở cấp nhóm quảng cáo bằng cách sử dụng AdGroupCriterion.
Cách đính kèm một BRANDS bộ tiêu chí được chia sẻ vào một nhóm quảng cáo (chỉ nhắm mục tiêu khẳng định; chỉ hỗ trợ tiêu chí nhắm mục tiêu phủ định ở cấp chiến dịch):
- Tạo một
AdGroupCriterion. - Đặt trường
brand_listthành đối tượngBrandListInfo. - Đặt
BrandListInfo.shared_setthành tên tài nguyên củaBRANDSSharedSet. - Dùng
AdGroupCriterionServiceđể tạoAdGroupCriterion.
Cách đính kèm một VERTICAL_ADS_ITEM_GROUP_RULE_LIST bộ tiêu chí dùng chung vào một nhóm quảng cáo:
- Tạo một
AdGroupCriterion. - Đặt trường
vertical_ads_item_group_rule_listthành đối tượngVerticalAdsItemGroupRuleListInfo. - Đặt
VerticalAdsItemGroupRuleListInfo.shared_setthành tên tài nguyên củaVERTICAL_ADS_ITEM_GROUP_RULE_LISTSharedSet. - Dùng
AdGroupCriterionServiceđể tạoAdGroupCriterion.
Cách đính kèm một RETAIL_FILTER bộ được chia sẻ vào một nhóm quảng cáo (chỉ dành cho phiên bản 24 trở lên, tài khoản trong danh sách cho phép):
- Tạo một
AdGroupCriterion. - Đặt trường
retail_filter_bundlethành đối tượngRetailFilterBundle. - Đặt
RetailFilterBundle.shared_setthành tên tài nguyên củaRETAIL_FILTERSharedSet. - Dùng
AdGroupCriterionServiceđể tạoAdGroupCriterion.
Cấp tài khoản
Nếu đang sử dụng tài khoản người quản lý, bạn có thể tạo SharedSet tài nguyên và chia sẻ tài nguyên đó với những tài khoản khách hàng thuộc hệ thống phân cấp tài khoản của bạn.
Ví dụ: để đính kèm một NEGATIVE_PLACEMENTS
SharedSet trong tài khoản người quản lý vào một tài khoản khách hàng, hãy sử dụng CustomerNegativeCriterion:
- Tạo một đối tượng
CustomerNegativeCriteriontrong tài khoản khách hàng. - Đặt trường
placement_listthành đối tượngPlacementListInfotrong đóPlacementListInfo.shared_setđược đặt thành tên tài nguyên củaSharedSettrong tài khoản người quản lý. - Sử dụng
CustomerNegativeCriterionServiceđể tạoCustomerNegativeCriterion.
Tương tự, bạn có thể đính kèm một ACCOUNT_LEVEL_NEGATIVE_KEYWORDS
SharedSet trong tài khoản người quản lý vào một tài khoản khách hàng:
- Tạo một đối tượng
CustomerNegativeCriteriontrong tài khoản khách hàng. - Đặt trường
negative_keyword_listthành đối tượngNegativeKeywordListInfotrong đóNegativeKeywordListInfo.shared_setđược đặt thành tên tài nguyên củaSharedSettrong tài khoản người quản lý. - Sử dụng
CustomerNegativeCriterionServiceđể tạoCustomerNegativeCriterion.
Ví dụ về mã nhóm từ khoá dùng chung
Java
// 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.v25.common.KeywordInfo; import com.google.ads.googleads.v25.enums.KeywordMatchTypeEnum.KeywordMatchType; import com.google.ads.googleads.v25.enums.SharedSetTypeEnum.SharedSetType; import com.google.ads.googleads.v25.errors.GoogleAdsError; import com.google.ads.googleads.v25.errors.GoogleAdsException; import com.google.ads.googleads.v25.resources.CampaignSharedSet; import com.google.ads.googleads.v25.resources.SharedCriterion; import com.google.ads.googleads.v25.resources.SharedSet; import com.google.ads.googleads.v25.services.CampaignSharedSetOperation; import com.google.ads.googleads.v25.services.CampaignSharedSetServiceClient; import com.google.ads.googleads.v25.services.MutateCampaignSharedSetsResponse; import com.google.ads.googleads.v25.services.MutateSharedCriteriaResponse; import com.google.ads.googleads.v25.services.MutateSharedCriterionResult; import com.google.ads.googleads.v25.services.MutateSharedSetsResponse; import com.google.ads.googleads.v25.services.SharedCriterionOperation; import com.google.ads.googleads.v25.services.SharedCriterionServiceClient; import com.google.ads.googleads.v25.services.SharedSetOperation; import com.google.ads.googleads.v25.services.SharedSetServiceClient; import com.google.ads.googleads.v25.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.V25.Common; using Google.Ads.GoogleAds.V25.Errors; using Google.Ads.GoogleAds.V25.Resources; using Google.Ads.GoogleAds.V25.Services; using System; using System.Collections.Generic; using static Google.Ads.GoogleAds.V25.Enums.KeywordMatchTypeEnum.Types; using static Google.Ads.GoogleAds.V25.Enums.SharedSetTypeEnum.Types; namespace Google.Ads.GoogleAds.Examples.V25 { /// <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.V25.SharedSetService); SharedCriterionServiceClient sharedCriterionService = client.GetService(Services.V25.SharedCriterionService); CampaignSharedSetServiceClient campaignSharedSetService = client.GetService(Services.V25.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\V25\GoogleAdsClient; use Google\Ads\GoogleAds\Lib\V25\GoogleAdsClientBuilder; use Google\Ads\GoogleAds\Lib\V25\GoogleAdsException; use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder; use Google\Ads\GoogleAds\Util\V25\ResourceNames; use Google\Ads\GoogleAds\V25\Common\KeywordInfo; use Google\Ads\GoogleAds\V25\Enums\KeywordMatchTypeEnum\KeywordMatchType; use Google\Ads\GoogleAds\V25\Enums\SharedSetTypeEnum\SharedSetType; use Google\Ads\GoogleAds\V25\Errors\GoogleAdsError; use Google\Ads\GoogleAds\V25\Resources\CampaignSharedSet; use Google\Ads\GoogleAds\V25\Resources\SharedCriterion; use Google\Ads\GoogleAds\V25\Resources\SharedSet; use Google\Ads\GoogleAds\V25\Services\CampaignSharedSetOperation; use Google\Ads\GoogleAds\V25\Services\MutateCampaignSharedSetsRequest; use Google\Ads\GoogleAds\V25\Services\MutateSharedCriteriaRequest; use Google\Ads\GoogleAds\V25\Services\MutateSharedSetsRequest; use Google\Ads\GoogleAds\V25\Services\SharedCriterionOperation; use Google\Ads\GoogleAds\V25\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.v24.errors.types.errors import GoogleAdsError from google.ads.googleads.v24.resources.types.campaign_shared_set import ( CampaignSharedSet, ) from google.ads.googleads.v24.resources.types.shared_criterion import ( SharedCriterion, ) from google.ads.googleads.v24.resources.types.shared_set import SharedSet from google.ads.googleads.v24.services.services.campaign_service import ( CampaignServiceClient, ) from google.ads.googleads.v24.services.services.campaign_shared_set_service import ( CampaignSharedSetServiceClient, ) from google.ads.googleads.v24.services.types.campaign_shared_set_service import ( CampaignSharedSetOperation, MutateCampaignSharedSetsResponse, ) from google.ads.googleads.v24.services.services.shared_criterion_service import ( SharedCriterionServiceClient, ) from google.ads.googleads.v24.services.services.shared_set_service import ( SharedSetServiceClient, ) from google.ads.googleads.v24.services.types.shared_criterion_service import ( MutateSharedCriteriaResponse, MutateSharedCriterionResult, SharedCriterionOperation, ) from google.ads.googleads.v24.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="v24" ) 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::V25::Resources::SharedSet; use Google::Ads::GoogleAds::V25::Resources::SharedCriterion; use Google::Ads::GoogleAds::V25::Resources::CampaignSharedSet; use Google::Ads::GoogleAds::V25::Common::KeywordInfo; use Google::Ads::GoogleAds::V25::Enums::SharedSetTypeEnum qw(NEGATIVE_KEYWORDS); use Google::Ads::GoogleAds::V25::Enums::KeywordMatchTypeEnum qw(BROAD); use Google::Ads::GoogleAds::V25::Services::SharedSetService::SharedSetOperation; use Google::Ads::GoogleAds::V25::Services::SharedCriterionService::SharedCriterionOperation; use Google::Ads::GoogleAds::V25::Services::CampaignSharedSetService::CampaignSharedSetOperation; use Google::Ads::GoogleAds::V25::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::V25::Resources::SharedSet->new({ name => "API Negative keyword list - " . uniqid(), type => NEGATIVE_KEYWORDS }); my $shared_set_operation = Google::Ads::GoogleAds::V25::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::V25::Resources::SharedCriterion->new({ keyword => Google::Ads::GoogleAds::V25::Common::KeywordInfo->new({ text => $keyword, matchType => BROAD } ), sharedSet => $shared_set_resource_name }); my $shared_criterion_operation = Google::Ads::GoogleAds::V25::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::V25::Resources::CampaignSharedSet->new({ campaign => Google::Ads::GoogleAds::V25::Utils::ResourceNames::campaign( $customer_id, $campaign_id ), sharedSet => $shared_set_resource_name }); my $campaign_shared_set_operation = Google::Ads::GoogleAds::V25::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