Create And Attach Shared Keyword Set
Stay organized with collections
Save and categorize content based on your preferences.
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.v21.common.KeywordInfo
;
import
com.google.ads.googleads.v21.enums.KeywordMatchTypeEnum.KeywordMatchType
;
import
com.google.ads.googleads.v21.enums.SharedSetTypeEnum.SharedSetType
;
import
com.google.ads.googleads.v21.errors.GoogleAdsError
;
import
com.google.ads.googleads.v21.errors.GoogleAdsException
;
import
com.google.ads.googleads.v21.resources.CampaignSharedSet
;
import
com.google.ads.googleads.v21.resources.SharedCriterion
;
import
com.google.ads.googleads.v21.resources.SharedSet
;
import
com.google.ads.googleads.v21.services.CampaignSharedSetOperation
;
import
com.google.ads.googleads.v21.services.CampaignSharedSetServiceClient
;
import
com.google.ads.googleads.v21.services.MutateCampaignSharedSetsResponse
;
import
com.google.ads.googleads.v21.services.MutateSharedCriteriaResponse
;
import
com.google.ads.googleads.v21.services.MutateSharedCriterionResult
;
import
com.google.ads.googleads.v21.services.MutateSharedSetsResponse
;
import
com.google.ads.googleads.v21.services.SharedCriterionOperation
;
import
com.google.ads.googleads.v21.services.SharedCriterionServiceClient
;
import
com.google.ads.googleads.v21.services.SharedSetOperation
;
import
com.google.ads.googleads.v21.services.SharedSetServiceClient
;
import
com.google.ads.googleads.v21.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.V21.Common
;
using
Google.Ads.GoogleAds.V21.Errors
;
using
Google.Ads.GoogleAds.V21.Resources
;
using
Google.Ads.GoogleAds.V21.Services
;
using
System
;
using
System.Collections.Generic
;
using
static
Google
.
Ads
.
GoogleAds
.
V21
.
Enums
.
KeywordMatchTypeEnum
.
Types
;
using
static
Google
.
Ads
.
GoogleAds
.
V21
.
Enums
.
SharedSetTypeEnum
.
Types
;
namespace
Google.Ads.GoogleAds.Examples.V21
{
/// <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
.
V21
.
SharedSetService
);
SharedCriterionServiceClient
sharedCriterionService
=
client
.
GetService
(
Services
.
V21
.
SharedCriterionService
);
CampaignSharedSetServiceClient
campaignSharedSetService
=
client
.
GetService
(
Services
.
V21
.
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\V21\GoogleAdsClient;
use Google\Ads\GoogleAds\Lib\V21\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Lib\V21\GoogleAdsException;
use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder;
use Google\Ads\GoogleAds\Util\V21\ResourceNames;
use Google\Ads\GoogleAds\V21\Common\KeywordInfo;
use Google\Ads\GoogleAds\V21\Enums\KeywordMatchTypeEnum\KeywordMatchType;
use Google\Ads\GoogleAds\V21\Enums\SharedSetTypeEnum\SharedSetType;
use Google\Ads\GoogleAds\V21\Errors\GoogleAdsError;
use Google\Ads\GoogleAds\V21\Resources\CampaignSharedSet;
use Google\Ads\GoogleAds\V21\Resources\SharedCriterion;
use Google\Ads\GoogleAds\V21\Resources\SharedSet;
use Google\Ads\GoogleAds\V21\Services\CampaignSharedSetOperation;
use Google\Ads\GoogleAds\V21\Services\MutateCampaignSharedSetsRequest;
use Google\Ads\GoogleAds\V21\Services\MutateSharedCriteriaRequest;
use Google\Ads\GoogleAds\V21\Services\MutateSharedSetsRequest;
use Google\Ads\GoogleAds\V21\Services\SharedCriterionOperation;
use Google\Ads\GoogleAds\V21\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.v21.errors.types.errors
import
GoogleAdsError
from
google.ads.googleads.v21.resources.types.campaign_shared_set
import
(
CampaignSharedSet
,
)
from
google.ads.googleads.v21.resources.types.shared_criterion
import
(
SharedCriterion
,
)
from
google.ads.googleads.v21.resources.types.shared_set
import
SharedSet
from
google.ads.googleads.v21.services.services.campaign_service
import
(
CampaignServiceClient
,
)
from
google.ads.googleads.v21.services.services.campaign_shared_set_service
import
(
CampaignSharedSetServiceClient
,
)
from
google.ads.googleads.v21.services.types.campaign_shared_set_service
import
(
CampaignSharedSetOperation
,
MutateCampaignSharedSetsResponse
,
)
from
google.ads.googleads.v21.services.services.shared_criterion_service
import
(
SharedCriterionServiceClient
,
)
from
google.ads.googleads.v21.services.services.shared_set_service
import
(
SharedSetServiceClient
,
)
from
google.ads.googleads.v21.services.types.shared_criterion_service
import
(
MutateSharedCriteriaResponse
,
MutateSharedCriterionResult
,
SharedCriterionOperation
,
)
from
google.ads.googleads.v21.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
'
\t
Error with message "
{
error
.
message
}
".'
)
if
error
.
location
:
for
field_path_element
in
error
.
location
.
field_path_elements
:
print
(
f
"
\t\t
On 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
=
"v21"
)
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
(
"
\t
On 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
(
"
\t
Type: %s
\n\t
Code: %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::V21::Resources::SharedSet
;
use
Google::Ads::GoogleAds::V21::Resources::SharedCriterion
;
use
Google::Ads::GoogleAds::V21::Resources::CampaignSharedSet
;
use
Google::Ads::GoogleAds::V21::Common::KeywordInfo
;
use
Google::Ads::GoogleAds::V21::Enums::SharedSetTypeEnum
qw(NEGATIVE_KEYWORDS)
;
use
Google::Ads::GoogleAds::V21::Enums::KeywordMatchTypeEnum
qw(BROAD)
;
use
Google::Ads::GoogleAds::V21::Services::SharedSetService::SharedSetOperation
;
use
Google::Ads::GoogleAds::V21::Services::SharedCriterionService::SharedCriterionOperation
;
use
Google::Ads::GoogleAds::V21::Services::CampaignSharedSetService::CampaignSharedSetOperation
;
use
Google::Ads::GoogleAds::V21::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::V21::Resources::
SharedSet
-
> new
({
name
=
>
"API Negative keyword list - "
.
uniqid
(),
type
=
>
NEGATIVE_KEYWORDS
});
my
$shared_set_operation
=
Google::Ads::GoogleAds::V21::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::V21::Resources::
SharedCriterion
-
> new
({
keyword
=
>
Google::Ads::GoogleAds::V21::Common::
KeywordInfo
-
> new
({
text
=
>
$keyword
,
matchType
=
>
BROAD
}
),
sharedSet
=
>
$shared_set_resource_name
});
my
$shared_criterion_operation
=
Google::Ads::GoogleAds::V21::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::V21::Resources::
CampaignSharedSet
-
> new
({
campaign
=
>
Google::Ads::GoogleAds::V21::Utils::ResourceNames::
campaign
(
$customer_id
,
$campaign_id
),
sharedSet
=
>
$shared_set_resource_name
});
my
$campaign_shared_set_operation
=
Google::Ads::GoogleAds::V21::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/-//g
r
,
$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
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License
, and code samples are licensed under the Apache 2.0 License
. For details, see the Google Developers Site Policies
. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-09-03 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-03 UTC."],[[["\u003cp\u003eThis code demonstrates how to create and manage shared negative keyword lists in Google Ads using its API.\u003c/p\u003e\n"],["\u003cp\u003eNegative keywords "mars cruise" and "mars hotels" are added to the shared set, ensuring ads do not show for these searches.\u003c/p\u003e\n"],["\u003cp\u003eThe shared set is then linked to a target campaign, applying the negative keywords to that campaign's advertising efforts.\u003c/p\u003e\n"],["\u003cp\u003eThis approach is beneficial for advertisers looking to optimize campaigns by excluding unwanted search terms.\u003c/p\u003e\n"],["\u003cp\u003eThis functionality is demonstrated using Java, C#, PHP, and Python programming languages.\u003c/p\u003e\n"]]],[],null,[]]