import argparse
import sys
from google.ads.googleads.client
import GoogleAdsClient
from google.ads.googleads.errors
import GoogleAdsException
_DEFAULT_PAGE_SIZE =
10000
def main(client
, customer_id
, shared_set_names
, keywords):
ga_service = client.get_service(
"GoogleAdsService")
shared_criterion_service = client.get_service(
"SharedCriterionService")
# First, retrieve all shared sets associated with the campaign.
shared_sets_query = (
f"SELECT\n"
f"shared_set.id,\n"
f"shared_set.name\n"
f"FROM shared_set\n"
f"WHERE shared_set.name = '{shared_set_names
}'")
try:
shared_set_search_request = client.get_type(
"SearchGoogleAdsRequest")
shared_set_search_request.customer_id = customer_id
shared_set_search_request.query = shared_sets_query
shared_set_search_request.page_size = _DEFAULT_PAGE_SIZE
shared_set_response = ga_service.search(
request=shared_set_search_request
)
shared_set_ids = []
for row
in shared_set_response:
shared_set = row.shared_set
shared_set_ids.append(
str(
shared_set.id))
print(
f'Campaign shared set ID "{shared_set.id}" and name '
f'"{shared_set.name}" was found.'
)
except GoogleAdsException
as ex:
handle_googleads_exception(ex)
ids =
"','".join(shared_set_ids)
kws =
"','".join(keywords)
shared_criteria_query = (
f"SELECT\n"
f"shared_criterion.type,\n"
f"shared_criterion.keyword.text,\n"
f"shared_criterion.keyword.match_type,\n"
f"shared_set.id\n"
f"FROM shared_criterion\n"
f"WHERE shared_set.id IN ('{ids
}')\n"
f"AND shared_criterion.keyword.text IN ('{kws
}')\n")
try:
shared_criteria_search_request = client.get_type(
"SearchGoogleAdsRequest"
)
shared_criteria_search_request.customer_id = customer_id
shared_criteria_search_request.query = shared_criteria_query
shared_criteria_search_request.page_size = _DEFAULT_PAGE_SIZE
shared_criteria_response = ga_service.search(
request=shared_criteria_search_request
)
except GoogleAdsException
as ex:
handle_googleads_exception(ex)
criterion_type_enum = client.enums.CriterionTypeEnum
criterion_ids = []
for row
in shared_criteria_response:
shared_criterion = row.shared_criterion
shared_criterion_resource_name = shared_criterion.resource_name
if shared_criterion.type_ == criterion_type_enum.KEYWORD:
keyword = shared_criterion.keyword
print(
"Shared criterion with resource name "
f'"{shared_criterion_resource_name
}" for negative keyword '
f'with text "{keyword.text
}" and match type '
f'"{keyword.match_type.name}" was found.'
)
criterion_ids.append(shared_criterion_resource_name)
# Finally, remove the criteria.
operations = []
for criteria_id
in criterion_ids:
shared_criterion_operation = client.get_type(
"SharedCriterionOperation")
shared_criterion_operation.remove = criteria_id
operations.append(shared_criterion_operation)
try:
response = shared_criterion_service.mutate_shared_criteria(
customer_id=customer_id
, operations=operations
)
for result
in response.results:
print(
f'Removed shared criterion "{result.resource_name
}".')
except GoogleAdsException
as ex:
handle_googleads_exception(ex)
def handle_googleads_exception(exception):
print(
f'Request with ID "{exception.request_id
}" failed with status '
f'"{exception.error.code().name
}" and includes the following errors:'
)
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)
class StringWithSpace(argparse.Action):
def __call__(
self, parser
, namespace
, values
, option_string=
None):
setattr(namespace
, self.dest
, ' '.join(values))
if __name__ ==
"__main__":
# GoogleAdsClient will read the google-ads.yaml configuration file in the
# home directory if none is specified.
AUTH_PATH =
"lib/google-ads.yaml"
googleads_client = GoogleAdsClient.load_from_storage(AUTH_PATH
, version=
"v13")
parser = argparse.ArgumentParser(
description=(
"Finds shared sets, then finds and removes shared set "
"criteria under them."
)
)
# 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(
"-n",
"--shared_set_name",
action=StringWithSpace
,
type=
str,
required=
True,
help=
"The negative keyword shared set name."
)
parser.add_argument(
"-k",
"--keywords",
nargs=
'+',
type=
str,
required=
True,
help=
"The Keywords to be exclueded from list."
)
args = parser.parse_args()
main(
googleads_client
, args.customer_id
, args.shared_set_name
, args.keywords
)