google-adx-buyer-api 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. data/ChangeLog +4 -0
  2. data/README +3 -3
  3. data/examples/v201209/account_management/get_account_changes.rb +137 -0
  4. data/examples/v201209/basic_operations/add_ad_group.rb +88 -0
  5. data/examples/v201209/basic_operations/add_campaign.rb +105 -0
  6. data/examples/v201209/basic_operations/add_placements.rb +99 -0
  7. data/examples/v201209/basic_operations/add_thirdparty_redirect_ad.rb +126 -0
  8. data/examples/v201209/basic_operations/delete_ad.rb +80 -0
  9. data/examples/{v201206/reporting/download_defined_report.rb → v201209/basic_operations/delete_ad_group.rb} +21 -12
  10. data/examples/v201209/basic_operations/delete_campaign.rb +77 -0
  11. data/examples/v201209/basic_operations/delete_placement.rb +86 -0
  12. data/examples/v201209/basic_operations/get_ad_groups.rb +80 -0
  13. data/examples/v201209/basic_operations/get_campaigns.rb +77 -0
  14. data/examples/v201209/basic_operations/get_placements.rb +92 -0
  15. data/examples/v201209/basic_operations/get_thirdparty_redirect_ads.rb +100 -0
  16. data/examples/v201209/basic_operations/pause_ad.rb +81 -0
  17. data/examples/v201209/basic_operations/update_ad_group.rb +76 -0
  18. data/examples/v201209/basic_operations/update_campaign.rb +79 -0
  19. data/examples/v201209/basic_operations/update_placement.rb +94 -0
  20. data/examples/v201209/campaign_management/add_placements_in_bulk.rb +151 -0
  21. data/examples/v201209/campaign_management/get_all_disapproved_ads.rb +92 -0
  22. data/examples/v201209/error_handling/handle_captcha_challenge.rb +93 -0
  23. data/examples/v201209/error_handling/handle_partial_failures.rb +117 -0
  24. data/examples/v201209/error_handling/handle_policy_violation_error.rb +138 -0
  25. data/examples/v201209/error_handling/handle_two_factor_authorization_error.rb +87 -0
  26. data/examples/v201209/misc/get_all_images_and_videos.rb +101 -0
  27. data/examples/v201209/misc/upload_image.rb +87 -0
  28. data/examples/v201209/misc/use_oauth.rb +97 -0
  29. data/examples/v201209/optimization/get_placement_ideas.rb +106 -0
  30. data/examples/v201209/remarketing/add_audience.rb +111 -0
  31. data/examples/v201209/remarketing/add_conversion_tracker.rb +93 -0
  32. data/examples/v201209/reporting/download_criteria_report.rb +79 -0
  33. data/examples/v201209/reporting/get_campaign_stats.rb +105 -0
  34. data/examples/{v201206/reporting/get_defined_reports.rb → v201209/reporting/get_report_fields.rb} +13 -17
  35. data/examples/v201209/reporting/parallel_report_download.rb +159 -0
  36. data/examples/v201209/targeting/add_campaign_targeting_criteria.rb +110 -0
  37. data/examples/v201209/targeting/get_campaign_targeting_criteria.rb +104 -0
  38. data/examples/v201209/targeting/get_targetable_languages_and_carriers.rb +82 -0
  39. data/examples/v201209/targeting/lookup_location.rb +104 -0
  40. metadata +89 -34
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
7
+ #
8
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ # This example illustrates how to update a placement, setting its bid. To create
22
+ # a placement, run add_placements.rb.
23
+ #
24
+ # Tags: AdGroupCriterionService.mutate
25
+
26
+ require 'adwords_api'
27
+
28
+ def update_placement(ad_group_id, placement_id)
29
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
+ # when called without parameters.
31
+ adwords = AdwordsApi::Api.new
32
+
33
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
+ # the configuration file or provide your own logger:
35
+ # adwords.logger = Logger.new('adwords_xml.log')
36
+
37
+ ad_group_criterion_srv =
38
+ adwords.service(:AdGroupCriterionService, API_VERSION)
39
+
40
+ # Prepare for updating a placement.
41
+ operation = {
42
+ :operator => 'SET',
43
+ :operand => {
44
+ # The 'xsi_type' field allows you to specify the xsi:type of the object
45
+ # being created. It's only necessary when you must provide an explicit
46
+ # type that the client library can't infer.
47
+ :xsi_type => 'BiddableAdGroupCriterion',
48
+ :ad_group_id => ad_group_id,
49
+ :criterion => {
50
+ :id => placement_id
51
+ },
52
+ :bids => {
53
+ :xsi_type => 'ManualCPMAdGroupCriterionBids',
54
+ :max_cpm => {
55
+ :amount => {
56
+ :micro_amount => 1000000
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ # Update the placement.
64
+ response = ad_group_criterion_srv.mutate([operation])
65
+ ad_group_criterion = response[:value].first
66
+ puts "Placement ID %d was successfully updated, bid set to %.2f." %
67
+ [ad_group_criterion[:criterion][:id],
68
+ ad_group_criterion[:bids][:max_cpm][:amount][:micro_amount] / 1000000]
69
+ end
70
+
71
+ if __FILE__ == $0
72
+ API_VERSION = :v201209
73
+
74
+ begin
75
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
76
+ placement_id = 'INSERT_PLACEMENT_ID_HERE'.to_i
77
+ update_placement(ad_group_id, placement_id)
78
+
79
+ # HTTP errors.
80
+ rescue AdsCommon::Errors::HttpError => e
81
+ puts "HTTP Error: %s" % e
82
+
83
+ # API errors.
84
+ rescue AdwordsApi::Errors::ApiException => e
85
+ puts "Message: %s" % e.message
86
+ puts 'Errors:'
87
+ e.errors.each_with_index do |error, index|
88
+ puts "\tError [%d]:" % (index + 1)
89
+ error.each do |field, value|
90
+ puts "\t\t%s: %s" % [field, value]
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
7
+ #
8
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ # This code sample illustrates how to perform asynchronous requests using the
22
+ # MutateJobService.
23
+ #
24
+ # Tags: MutateJobService.mutate, MutateJobService.get,
25
+ # MutateJobService.getResult
26
+
27
+ require 'adwords_api'
28
+
29
+ def add_placements_in_bulk(ad_group_id)
30
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
31
+ # when called without parameters.
32
+ adwords = AdwordsApi::Api.new
33
+
34
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
35
+ # the configuration file or provide your own logger:
36
+ # adwords.logger = Logger.new('adwords_xml.log')
37
+
38
+ mutate_job_srv = adwords.service(:MutateJobService, API_VERSION)
39
+
40
+ # Create AdGroupCriterionOperations to add placements.
41
+ operations = (1..PLACEMENT_NUMBER).map do |index|
42
+ # Add small fraction of invalid URLs to demonstrate errors.
43
+ url = (rand(10) == 0) ? 'invalid-url' : 'http://mars.google.com/'
44
+ {:xsi_type => 'AdGroupCriterionOperation',
45
+ :operator => 'ADD',
46
+ :operand => {
47
+ :xsi_type => 'BiddableAdGroupCriterion',
48
+ :ad_group_id => ad_group_id,
49
+ :criterion => {
50
+ :xsi_type => 'Placement',
51
+ :url => url
52
+ }}}
53
+ end
54
+
55
+ # You can specify up to 3 job IDs that must successfully complete before
56
+ # this job can be processed.
57
+ policy = {:prerequisite_job_ids => []}
58
+
59
+ # Call mutate to create a new job.
60
+ response = mutate_job_srv.mutate(operations, policy)
61
+
62
+ raise StandardError, 'Failed to submit a job; aborting.' unless response
63
+
64
+ job_id = response[:id]
65
+ puts "Job ID %d was successfully created." % job_id
66
+
67
+ # Creating selector to retrive job status and wait for it to complete.
68
+ selector = {
69
+ :xsi_type => 'BulkMutateJobSelector',
70
+ :job_ids => [job_id]
71
+ }
72
+
73
+ status = nil
74
+
75
+ # Poll for job status until it's finished.
76
+ puts 'Retrieving job status...'
77
+ RETRIES_COUNT.times do |retry_attempt|
78
+ job_status_response = mutate_job_srv.get(selector)
79
+ if job_status_response
80
+ status = job_status_response.first[:status]
81
+ case status
82
+ when 'FAILED'
83
+ raise StandardError, "Job failed with reason: '%s'" %
84
+ job_status_response.first[:failure_reason]
85
+ when 'COMPLETED'
86
+ puts "[%d] Job finished with status '%s'" % [retry_attempt, status]
87
+ break
88
+ else
89
+ puts "[%d] Current status is '%s', waiting %d seconds to retry..." %
90
+ [retry_attempt, status, RETRY_INTERVAL]
91
+ sleep(RETRY_INTERVAL)
92
+ end
93
+ else
94
+ raise StandardError, 'Error retrieving job status; aborting.'
95
+ end
96
+ end
97
+
98
+ if status == 'COMPLETED'
99
+ # Get the job result. Here we re-use the same selector.
100
+ result_response = mutate_job_srv.get_result(selector)
101
+
102
+ if result_response and result_response[:simple_mutate_result]
103
+ results = result_response[:simple_mutate_result][:results]
104
+ if results
105
+ results.each_with_index do |result, index|
106
+ result_message = result.include?(:place_holder) ?
107
+ 'FAILED' : 'SUCCEEDED'
108
+ puts "Operation [%d] - %s" % [index, result_message]
109
+ end
110
+ end
111
+ errors = result_response[:simple_mutate_result][:errors]
112
+ if errors
113
+ errors.each do |error|
114
+ puts "Error, reason: '%s', trigger: '%s', field path: '%s'" %
115
+ [error[:reason], error[:trigger], error[:field_path]]
116
+ end
117
+ end
118
+ else
119
+ raise StandardError, 'Error retrieving job results; aborting.'
120
+ end
121
+ else
122
+ puts "Job failed to complete after %d retries" % RETRY_COUNT
123
+ end
124
+ end
125
+
126
+ if __FILE__ == $0
127
+ API_VERSION = :v201209
128
+ RETRY_INTERVAL = 30
129
+ RETRIES_COUNT = 30
130
+ PLACEMENT_NUMBER = 100
131
+
132
+ begin
133
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
134
+ add_placements_in_bulk(ad_group_id)
135
+
136
+ # HTTP errors.
137
+ rescue AdsCommon::Errors::HttpError => e
138
+ puts "HTTP Error: %s" % e
139
+
140
+ # API errors.
141
+ rescue AdwordsApi::Errors::ApiException => e
142
+ puts "Message: %s" % e.message
143
+ puts 'Errors:'
144
+ e.errors.each_with_index do |error, index|
145
+ puts "\tError [%d]:" % (index + 1)
146
+ error.each do |field, value|
147
+ puts "\t\t%s: %s" % [field, value]
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.sgomes@gmail.com (Sérgio Gomes)
5
+ #
6
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
7
+ #
8
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ # This example illustrates how to retrieve all the disapproved ads in a given
22
+ # ad group. To add ads, run add_thirdparty_redirect_ad.rb.
23
+ #
24
+ # Tags: AdGroupAdService.get
25
+
26
+ require 'adwords_api'
27
+
28
+ def get_all_disapproved_ads(ad_group_id)
29
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
+ # when called without parameters.
31
+ adwords = AdwordsApi::Api.new
32
+
33
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
+ # the configuration file or provide your own logger:
35
+ # adwords.logger = Logger.new('adwords_xml.log')
36
+
37
+ ad_group_ad_srv = adwords.service(:AdGroupAdService, API_VERSION)
38
+
39
+ # Get all the disapproved ads for this campaign.
40
+ selector = {
41
+ :fields => ['Id', 'DisapprovalReasons'],
42
+ :ordering => [{:field => 'Id', :sort_order => 'ASCENDING'}],
43
+ :predicates => [
44
+ {:field => 'AdGroupId', :operator => 'IN', :values => [ad_group_id]},
45
+ {
46
+ :field => 'AdGroupCreativeApprovalStatus',
47
+ :operator => 'IN',
48
+ :values => ['DISAPPROVED']
49
+ }
50
+ ]
51
+ }
52
+ response = ad_group_ad_srv.get(selector)
53
+ if response and response[:entries]
54
+ ad_group_ads = response[:entries]
55
+ puts "Ad group ##{ad_group_id} has #{ad_group_ads.length} " +
56
+ "disapproved ad(s)."
57
+ ad_group_ads.each do |ad_group_ad|
58
+ puts " Ad with id #{ad_group_ad[:ad][:id]} and type " +
59
+ "#{ad_group_ad[:ad][:xsi_type]} was disapproved for the following " +
60
+ "reasons:"
61
+ ad_group_ad[:ad][:disapproval_reasons].each do |reason|
62
+ puts " #{reason}"
63
+ end
64
+ end
65
+ else
66
+ puts "No disapproved ads found for ad group ID %d" % ad_group_id
67
+ end
68
+ end
69
+
70
+ if __FILE__ == $0
71
+ API_VERSION = :v201209
72
+
73
+ begin
74
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
75
+ get_all_disapproved_ads(ad_group_id)
76
+
77
+ # HTTP errors.
78
+ rescue AdsCommon::Errors::HttpError => e
79
+ puts "HTTP Error: %s" % e
80
+
81
+ # API errors.
82
+ rescue AdwordsApi::Errors::ApiException => e
83
+ puts "Message: %s" % e.message
84
+ puts 'Errors:'
85
+ e.errors.each_with_index do |error, index|
86
+ puts "\tError [%d]:" % (index + 1)
87
+ error.each do |field, value|
88
+ puts "\t\t%s: %s" % [field, value]
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2012, Google Inc. All Rights Reserved.
7
+ #
8
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ # This example illustrates how to handle 'CAPTCHA required' authorization
22
+ # errors. Refer to the best practices guide on how to avoid this error:
23
+ #
24
+ # http://code.google.com/apis/adwords/docs/guides/bestpractices.html#auth_tokens
25
+
26
+ require 'adwords_api'
27
+
28
+ def handle_captcha_challenge()
29
+ # Initialize token variable.
30
+ logintoken = nil
31
+
32
+ # This code will repeatedly request authToken from the server until it gets
33
+ # a CAPTCHA challenge request. It is here for illustration purposes only
34
+ # and should never be used in a real application.
35
+ begin
36
+ MAX_RETRIES.times do |retry_number|
37
+ puts "Running request %d of %d..." % [retry_number + 1, MAX_RETRIES]
38
+ # Forcing library to request a new authorization token.
39
+ adwords = AdwordsApi::Api.new
40
+ auth_token = adwords.authorize()
41
+ end
42
+ # Still no challenge, make sure ClientLogin authorization is used.
43
+ raise StandardError, "Failed to get challenge after %d requests." %
44
+ MAX_RETRIES
45
+ rescue AdsCommon::Errors::CaptchaRequiredError => e
46
+ logintoken = e.captcha_token
47
+ end
48
+
49
+ puts "CaptchaRequiredError occurred. To recover download the image and type" +
50
+ " the CAPTCHA below: %s\n" % e.captcha_url
51
+ puts 'Enter code or ENTER to retry: '
52
+ logincaptcha = gets.chomp
53
+
54
+ # Initialize variable for extra parameters.
55
+ credentials = {}
56
+ if logincaptcha and !logincaptcha.empty?
57
+ credentials[:logincaptcha] = logincaptcha
58
+ credentials[:logintoken] = logintoken
59
+ end
60
+
61
+ begin
62
+ adwords = AdwordsApi::Api.new
63
+ auth_token = adwords.authorize(credentials)
64
+ puts "Successfully retrieved authToken: " + auth_token
65
+ rescue AdsCommon::Errors::CaptchaRequiredError => e
66
+ puts 'Invalid CAPTCHA text entered.'
67
+ raise e
68
+ end
69
+ end
70
+
71
+ if __FILE__ == $0
72
+ API_VERSION = :v201209
73
+ MAX_RETRIES = 500
74
+
75
+ begin
76
+ handle_captcha_challenge()
77
+
78
+ # HTTP errors.
79
+ rescue AdsCommon::Errors::HttpError => e
80
+ puts "HTTP Error: %s" % e
81
+
82
+ # API errors.
83
+ rescue AdwordsApi::Errors::ApiException => e
84
+ puts "Message: %s" % e.message
85
+ puts 'Errors:'
86
+ e.errors.each_with_index do |error, index|
87
+ puts "\tError [%d]:" % (index + 1)
88
+ error.each do |field, value|
89
+ puts "\t\t%s: %s" % [field, value]
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env ruby
2
+ # Encoding: utf-8
3
+ #
4
+ # Author:: api.dklimkin@gmail.com (Danial Klimkin)
5
+ #
6
+ # Copyright:: Copyright 2011, Google Inc. All Rights Reserved.
7
+ #
8
+ # License:: Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ # This example demonstrates how to handle partial failures.
22
+ #
23
+ # Tags: AdGroupCriterionService.mutate
24
+
25
+ require 'adwords_api'
26
+ require 'adwords_api/utils'
27
+
28
+ def handle_partial_failures(ad_group_id)
29
+ # AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
30
+ # when called without parameters.
31
+ adwords = AdwordsApi::Api.new
32
+
33
+ # To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
34
+ # the configuration file or provide your own logger:
35
+ # adwords.logger = Logger.new('adwords_xml.log')
36
+
37
+ ad_group_criterion_srv =
38
+ adwords.service(:AdGroupCriterionService, API_VERSION)
39
+
40
+ # Set partial failures flag.
41
+ adwords.partial_failure = true
42
+
43
+ # Create placements
44
+ urls = ['http://mars.google.com', 'http:/mars.google.com', 'mars.google.com']
45
+ placements = urls.map do |url|
46
+ {
47
+ # The 'xsi_type' field allows you to specify the xsi:type of the object
48
+ # being created. It's only necessary when you must provide an explicit
49
+ # type that the client library can't infer.
50
+ :xsi_type => 'Placement',
51
+ :url => url
52
+ }
53
+ end
54
+
55
+ # Create biddable ad group criteria and operations.
56
+ operations = placements.map do |placement|
57
+ {
58
+ :operator => 'ADD',
59
+ :operand => {
60
+ :xsi_type => 'BiddableAdGroupCriterion',
61
+ :ad_group_id => ad_group_id,
62
+ :criterion => placement
63
+ }
64
+ }
65
+ end
66
+
67
+ # Add placements.
68
+ response = ad_group_criterion_srv.mutate(operations)
69
+ ad_group_criteria = response[:value]
70
+ ad_group_criteria.each do |ad_group_criterion|
71
+ if ad_group_criterion[:criterion]
72
+ puts ("Placement for ad group ID %d }, placement ID %d " +
73
+ "and URL '%s' was added.") %
74
+ [ad_group_criterion[:ad_group_id],
75
+ ad_group_criterion[:criterion][:id],
76
+ ad_group_criterion[:criterion][:url]]
77
+ end
78
+ end
79
+
80
+ # Check partial failures.
81
+ if response and response[:partial_failure_errors]
82
+ response[:partial_failure_errors].each do |error|
83
+ operation_index = AdwordsApi::Utils.operation_index_for_error(error)
84
+ if operation_index
85
+ ad_group_criterion = operations[operation_index][:operand]
86
+ puts "Placement for ad group ID %d and URL '%s' triggered an error: " %
87
+ [ad_group_criterion[:ad_group_id],
88
+ ad_group_criterion[:criterion][:text]]
89
+ puts "\t%s" % error[:error_string]
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ if __FILE__ == $0
96
+ API_VERSION = :v201209
97
+
98
+ begin
99
+ ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
100
+ handle_partial_failures(ad_group_id)
101
+
102
+ # HTTP errors.
103
+ rescue AdsCommon::Errors::HttpError => e
104
+ puts "HTTP Error: %s" % e
105
+
106
+ # API errors.
107
+ rescue AdwordsApi::Errors::ApiException => e
108
+ puts "Message: %s" % e.message
109
+ puts 'Errors:'
110
+ e.errors.each_with_index do |error, index|
111
+ puts "\tError [%d]:" % (index + 1)
112
+ error.each do |field, value|
113
+ puts "\t\t%s: %s" % [field, value]
114
+ end
115
+ end
116
+ end
117
+ end