Java
// Copyright 2021 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.v18.enums.AdvertisingChannelTypeEnum.AdvertisingChannelType; import com.google.ads.googleads.v18.enums.SeasonalityEventScopeEnum.SeasonalityEventScope; import com.google.ads.googleads.v18.errors.GoogleAdsError; import com.google.ads.googleads.v18.errors.GoogleAdsException; import com.google.ads.googleads.v18.resources.BiddingDataExclusion; import com.google.ads.googleads.v18.services.BiddingDataExclusionOperation; import com.google.ads.googleads.v18.services.BiddingDataExclusionServiceClient; import com.google.ads.googleads.v18.services.MutateBiddingDataExclusionsResponse; import com.google.common.collect.ImmutableList; import java.io.FileNotFoundException; import java.io.IOException; /** * Adds a data exclusion for all search campaigns that excludes conversions from being used by Smart * Bidding for the time interval specified. * * <p>For more information on using data exclusions, see * https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions. */ public class AddBiddingDataExclusion { private static class AddBiddingDataExclusionParams extends CodeSampleParams { @Parameter( names = ArgumentNames.CUSTOMER_ID, required = true, description = "The client customer ID of the Google Ads account that the data exclusion will" + " be added to.") private Long customerId; @Parameter( names = ArgumentNames.START_DATE_TIME, required = true, description = "The start date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period.") private String startDateTime; @Parameter( names = ArgumentNames.END_DATE_TIME, required = true, description = "The end date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period.") private String endDateTime; } public static void main(String[] args) throws IOException { AddBiddingDataExclusionParams params = new AddBiddingDataExclusionParams(); 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.startDateTime = "INSERT_START_DATE_TIME_HERE"; params.endDateTime = "INSERT_END_DATE_TIME_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 AddBiddingDataExclusion() .runExample(googleAdsClient, params.customerId, params.startDateTime, params.endDateTime); } 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); } } /** * Adds a "CHANNEL" scoped data exclusion for the client customer ID and dates specified. * * @param googleAdsClient the GoogleAdsClient * @param customerId the client ID of the Google Ads account * @param startDateTime the start time of the data exclusion (in yyyy-MM-dd HH:mm:ss format) in * the account's timezone * @param endDateTime the end time of the data exclusion (in yyyy-MM-dd HH:mm:ss format) in the * account's timezone */ private void runExample( GoogleAdsClient googleAdsClient, Long customerId, String startDateTime, String endDateTime) { try (BiddingDataExclusionServiceClient DataExclusionServiceClient = googleAdsClient.getLatestVersion().createBiddingDataExclusionServiceClient()) { BiddingDataExclusion DataExclusion = BiddingDataExclusion.newBuilder() // A unique name is required for every data exclusion. .setName("Data exclusion #" + getPrintableDateTime()) // The CHANNEL scope applies the data exclusion to all campaigns of specific // advertising channel types. In this example, the exclusion will only apply to // Search campaigns. Use the CAMPAIGN scope to instead limit the scope to specific // campaigns. .setScope(SeasonalityEventScope.CHANNEL) .addAdvertisingChannelTypes(AdvertisingChannelType.SEARCH) // If setting scope CAMPAIGN, add individual campaign resource name(s) according to // the commented out line below. // .addCampaigns("INSERT_CAMPAIGN_RESOURCE_NAME_HERE") .setStartDateTime(startDateTime) .setEndDateTime(endDateTime) .build(); BiddingDataExclusionOperation operation = BiddingDataExclusionOperation.newBuilder().setCreate(DataExclusion).build(); MutateBiddingDataExclusionsResponse response = DataExclusionServiceClient.mutateBiddingDataExclusions( customerId.toString(), ImmutableList.of(operation)); System.out.printf( "Added data exclusion with resource name: %s%n", response.getResults(0).getResourceName()); } } }
C#
// Copyright 2021 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.V18.Errors; using Google.Ads.GoogleAds.V18.Resources; using Google.Ads.GoogleAds.V18.Services; using System; using System.Collections.Generic; using static Google.Ads.GoogleAds.V18.Enums.AdvertisingChannelTypeEnum.Types; using static Google.Ads.GoogleAds.V18.Enums.SeasonalityEventScopeEnum.Types; namespace Google.Ads.GoogleAds.Examples.V18 { /// <summary> /// This code example adds a channel-level data exclusion that excludes conversions from /// being used by Smart Bidding for the time interval specified. /// /// For more information on using data exclusions, see /// https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions. /// </summary> public class AddBiddingDataExclusion : ExampleBase { /// <summary> /// Command line options for running the <see cref="AddBiddingDataExclusion"/> 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 start date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period. /// </summary> [Option("startDateTime", Required = true, HelpText = "The start date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period.")] public string StartDateTime { get; set; } /// <summary> /// The end date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period. /// </summary> [Option("endDateTime", Required = true, HelpText = "The end date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period.")] public string EndDateTime { 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); AddBiddingDataExclusion codeExample = new AddBiddingDataExclusion(); Console.WriteLine(codeExample.Description); codeExample.Run(new GoogleAdsClient(), options.CustomerId, options.StartDateTime, options.EndDateTime); } /// <summary> /// Returns a description about the code example. /// </summary> public override string Description => "This code example adds a channel-level data exclusion that excludes conversions " + "from being used by Smart Bidding for the time interval specified. For more " + "information on using data exclusions, see " + "https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions."; /// <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="startDateTime">The start time of the data exclusion (in /// yyyy-MM-dd HH:mm:ss format) in the account's timezone.</param> /// <param name="endDateTime">The end time of the data exclusion (in /// yyyy-MM-dd HH:mm:ss format) in the account's timezone.</param> public void Run(GoogleAdsClient client, long customerId, string startDateTime, string endDateTime) { // Get the BiddingDataExclusionServiceClient. BiddingDataExclusionServiceClient biddingDataExclusionService = client.GetService(Services.V18.BiddingDataExclusionService); BiddingDataExclusion dataExclusion = new BiddingDataExclusion() { // A unique name is required for every data exclusion. Name = "Data exclusion #" + ExampleUtilities.GetRandomString(), // The CHANNEL scope applies the data exclusion to all campaigns of specific // advertising channel types. In this example, the the exclusion will only apply to // Search campaigns. Use the CAMPAIGN scope to instead limit the scope to specific // campaigns. Scope = SeasonalityEventScope.Channel, AdvertisingChannelTypes = { AdvertisingChannelType.Search }, // The date range should be less than 14 days. StartDateTime = startDateTime, EndDateTime = endDateTime, }; BiddingDataExclusionOperation operation = new BiddingDataExclusionOperation() { Create = dataExclusion }; try { MutateBiddingDataExclusionsResponse response = biddingDataExclusionService.MutateBiddingDataExclusions( customerId.ToString(), new[] { operation }); Console.WriteLine($"Added data exclusion with resource name: " + $"{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 2021 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\OAuth2TokenBuilder; use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClient; use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClientBuilder; use Google\Ads\GoogleAds\Lib\V18\GoogleAdsException; use Google\Ads\GoogleAds\V18\Enums\AdvertisingChannelTypeEnum\AdvertisingChannelType; use Google\Ads\GoogleAds\V18\Enums\SeasonalityEventScopeEnum\SeasonalityEventScope; use Google\Ads\GoogleAds\V18\Errors\GoogleAdsError; use Google\Ads\GoogleAds\V18\Resources\BiddingDataExclusion; use Google\Ads\GoogleAds\V18\Services\BiddingDataExclusionOperation; use Google\Ads\GoogleAds\V18\Services\MutateBiddingDataExclusionsRequest; use Google\ApiCore\ApiException; /** * This example adds a customer-level data exclusion that excludes conversions from being used by * Smart Bidding for the time interval specified. * * For more information on using data exclusions, see * https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions */ class AddBiddingDataExclusion { private const CUSTOMER_ID = 'INSERT_CUSTOMER_ID_HERE'; private const START_DATE_TIME = 'INSERT_START_DATE_TIME_HERE'; private const END_DATE_TIME = 'INSERT_END_DATE_TIME_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::START_DATE_TIME => GetOpt::REQUIRED_ARGUMENT, ArgumentNames::END_DATE_TIME => 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::START_DATE_TIME] ?: self::START_DATE_TIME, $options[ArgumentNames::END_DATE_TIME] ?: self::END_DATE_TIME ); } 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. Adds a "CUSTOMER" scoped data exclusion for the client customer ID and * dates specified. * * @param GoogleAdsClient $googleAdsClient the Google Ads API client * @param int $customerId the customer ID * @param string $startDateTime the start time of the data exclusion (in yyyy-MM-dd HH:mm:ss * format) in the account's timezone * @param string $endDateTime the end time of the data exclusion (in yyyy-MM-dd HH:mm:ss * format) in the account's timezone */ public static function runExample( GoogleAdsClient $googleAdsClient, int $customerId, string $startDateTime, string $endDateTime ) { // Creates a bidding data exclusion. $dataExclusion = new BiddingDataExclusion([ // A unique name is required for every data exclusion. 'name' => 'Data exclusion #' . Helper::getPrintableDatetime(), // The CHANNEL scope applies the data exclusion to all campaigns of specific // advertising channel types. In this example, the exclusion will only apply to // Search campaigns. Use the CAMPAIGN scope to instead limit the scope to specific // campaigns. 'scope' => SeasonalityEventScope::CHANNEL, 'advertising_channel_types' => [AdvertisingChannelType::SEARCH], // If setting scope CAMPAIGN, add individual campaign resource name(s) according to // the commented out line below. // 'campaigns' => ['INSERT_CAMPAIGN_RESOURCE_NAME_HERE'], 'start_date_time' => $startDateTime, 'end_date_time' => $endDateTime ]); // Creates a bidding data exclusion operation. $biddingDataExclusionOperation = new BiddingDataExclusionOperation(); $biddingDataExclusionOperation->setCreate($dataExclusion); // Submits the bidding data exclusion operation to add the bidding data exclusion. $biddingDataExclusionServiceClient = $googleAdsClient->getBiddingDataExclusionServiceClient(); $response = $biddingDataExclusionServiceClient->mutateBiddingDataExclusions( MutateBiddingDataExclusionsRequest::build($customerId, [$biddingDataExclusionOperation]) ); printf( "Added bidding data exclusion with resource name: '%s'.%s", $response->getResults()[0]->getResourceName(), PHP_EOL ); } } AddBiddingDataExclusion::main();
Python
#!/usr/bin/env python # Copyright 2021 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. """Adds a channel-level data exclusion for Smart Bidding. The exclusion specifically excludes conversions from being used by Smart Bidding for the time interval specified. For more information on using data exclusions, see: https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions """ import argparse import sys from uuid import uuid4 from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException def main(client, customer_id, start_date_time, end_date_time): """The main method that creates all necessary entities for the example. Args: client: an initialized GoogleAdsClient instance. customer_id: a client customer ID. start_date_time: a str of the start date for the exclusion period. end_date_time: a str of the end date for the exclusion period. """ bidding_data_exclusion_service = client.get_service( "BiddingDataExclusionService" ) operation = client.get_type("BiddingDataExclusionOperation") bidding_data_exclusion = operation.create # A unique name is required for every data exclusion bidding_data_exclusion.name = f"Data exclusion #{uuid4()}" # The CHANNEL scope applies the data exclusion to all campaigns of specific # advertising channel types. In this example, the exclusion will only # apply to Search campaigns. Use the CAMPAIGN scope to instead limit the # scope to specific campaigns. bidding_data_exclusion.scope = ( client.enums.SeasonalityEventScopeEnum.CHANNEL ) bidding_data_exclusion.advertising_channel_types.append( client.enums.AdvertisingChannelTypeEnum.SEARCH ) # If setting scope CAMPAIGN, add individual campaign resource name(s) # according to the commented out line below. # # bidding_data_exclusion.campaigns.append( # "INSERT_CAMPAIGN_RESOURCE_NAME_HERE" # ) bidding_data_exclusion.start_date_time = start_date_time bidding_data_exclusion.end_date_time = end_date_time response = bidding_data_exclusion_service.mutate_bidding_data_exclusions( customer_id=customer_id, operations=[operation] ) resource_name = response.results[0].resource_name print(f"Added data exclusion with resource name: '{resource_name}'") if __name__ == "__main__": parser = argparse.ArgumentParser( description="Adds a data exclusion for conversions in Smart Bidding " "for the given time interval." ) # 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( "-s", "--start_date_time", type=str, required=True, help="The start date for the exclusion period, must be in the format: " "'yyyy-MM-dd HH:mm:ss'.", ) parser.add_argument( "-e", "--end_date_time", type=str, required=True, help="The end date for the exclusion period, must be in the format: " "'yyyy-MM-dd HH:mm:ss'.", ) args = parser.parse_args() # GoogleAdsClient will read the google-ads.yaml configuration file in the # home directory if none is specified. googleads_client = GoogleAdsClient.load_from_storage(version="v18") try: main( googleads_client, args.customer_id, args.start_date_time, args.end_date_time, ) except GoogleAdsException as ex: print( f'Request with ID "{ex.request_id}" failed with status ' f'"{ex.error.code().name}" and includes the following errors:' ) for error in ex.failure.errors: print(f'Error 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)
Ruby
#!/usr/bin/env ruby # Encoding: utf-8 # # Copyright 2021 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. # # Adds a channel-level data exclusion for Smart Bidding. # # The exclusion specifically excludes conversions from being used by Smart # Bidding for the time interval specified. # # For more information on using data exclusions, see: # https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions require 'optparse' require 'google/ads/google_ads' def add_bidding_data_exclusion(customer_id, start_date_time, end_date_time) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new operation = client.operation.create_resource.bidding_data_exclusion do |bda| # A unique name is required for every data excluseion. bda.name = "Seasonality Adjustment #{(Time.new.to_f * 1000).to_i}" # The CHANNEL scope applies the data exclusion to all campaigns of specific # advertising channel types. In this example, the conversion_rate_modifier # will only apply to Search campaigns. Use the CAMPAIGN scope to instead # limit the scope to specific campaigns. bda.scope = :CHANNEL bda.advertising_channel_types << :SEARCH # If setting scope CAMPAIGN, add individual campaign resource name(s) # according to the commented out line below. # # bda.campaigns << "INSERT_CAMPAIGN_RESOURCE_NAME_HERE" bda.start_date_time = start_date_time bda.end_date_time = end_date_time end response = client.service.bidding_data_exclusion.mutate_bidding_data_exclusions( customer_id: customer_id, operations: [operation], ) puts "Added data exclusion with resource name #{response.results.first.resource_name}." end if __FILE__ == $0 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[:start_date_time] = 'INSERT_START_DATE_TIME_HERE' options[:end_date_time] = 'INSERT_END_DATE_TIME_HERE' OptionParser.new do |opts| opts.banner = sprintf('Usage: %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('-s', '--start-date-time START-DATE-TIME', String, 'The start date of the adjustment period, must be in the format:' \ 'yyyy-MM-dd HH:mm:ss') do |v| options[:start_date_time] = v end opts.on('-e', '--end-date-time END-DATE-TIME', String, 'The end date of the adjustment period, must be in the format:' \ 'yyyy-MM-dd HH:mm:ss') do |v| options[:end_date_time] = v end opts.separator '' opts.separator 'Help:' opts.on_tail('-h', '--help', 'Show this message') do puts opts exit end end.parse! begin add_bidding_data_exclusion( options.fetch(:customer_id).tr("-", ""), options.fetch(:start_date_time), options.fetch(:end_date_time), ) 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 2021, 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. # # Adds a customer-level data exclusion that excludes conversions from being used # by Smart Bidding for the time interval specified. # # For more information on using data exclusions, see: # https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions. 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::V18::Resources::BiddingDataExclusion; use Google::Ads::GoogleAds::V18::Enums::SeasonalityEventScopeEnum qw(CHANNEL); use Google::Ads::GoogleAds::V18::Enums::AdvertisingChannelTypeEnum qw(SEARCH); use Google::Ads::GoogleAds::V18::Services::BiddingDataExclusionService::BiddingDataExclusionOperation; 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 $start_date_time = "INSERT_START_DATE_TIME_HERE"; my $end_date_time = "INSERT_END_DATE_TIME_HERE"; # Adds a "CUSTOMER" scoped data exclusion for the client customer ID and dates specified. sub add_bidding_data_exclusion { my ($api_client, $customer_id, $start_date_time, $end_date_time) = @_; my $data_exclusion = Google::Ads::GoogleAds::V18::Resources::BiddingDataExclusion->new({ # A unique name is required for every data exclusion. name => "Data exclusion #" . uniqid(), # The CHANNEL scope applies the data exclusion to all campaigns of specific # advertising channel types. In this example, the exclusion will only apply # to Search campaigns. Use the CAMPAIGN scope to instead limit the scope to # specific campaigns. scope => CHANNEL, advertisingChannelTypes => [SEARCH], # If setting scope CAMPAIGN, add individual campaign resource name(s) # according to the commented out line below. # campaigns => ["INSERT_CAMPAIGN_RESOURCE_NAME_HERE"], startDateTime => $start_date_time, endDateTime => $end_date_time }); my $operation = Google::Ads::GoogleAds::V18::Services::BiddingDataExclusionService::BiddingDataExclusionOperation ->new({ create => $data_exclusion }); my $response = $api_client->BiddingDataExclusionService()->mutate({ customerId => $customer_id, operations => [$operation]}); printf "Added data exclusion with resource name: '%s'.\n", $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, "start_date_time=s" => \$start_date_time, "end_date_time=s" => \$end_date_time ); # 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, $start_date_time, $end_date_time); # Call the example. add_bidding_data_exclusion($api_client, $customer_id =~ s/-//gr, $start_date_time, $end_date_time); =pod =head1 NAME add_bidding_data_exclusion =head1 DESCRIPTION Adds a customer-level data exclusion that excludes conversions from being used by Smart Bidding for the time interval specified. For more information on using data exclusions, see: https://developers.google.com/google-ads/api/docs/campaigns/bidding/data-exclusions. =head1 SYNOPSIS add_bidding_data_exclusion.pl [options] -help Show the help message. -customer_id The client customer ID of the Google Ads account that the data exclusion will be added to. -start_date_time The start date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period. -end_date_time The end date time in yyyy-MM-dd HH:mm:ss format of the data exclusion period. =cut