google-adwords-api 0.9.0 → 0.9.1
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.
- data/ChangeLog +3 -0
- data/examples/v201302/advanced_operations/add_ad_group_bid_modifier.rb +97 -0
- data/examples/v201302/advanced_operations/get_ad_group_bid_modifiers.rb +98 -0
- data/examples/v201302/{campaign_management → migration}/set_campaign_enhanced.rb +0 -0
- data/examples/v201302/migration/upgrade_legacy_sitelinks.rb +305 -0
- data/lib/adwords_api/api_config.rb +4 -0
- data/lib/adwords_api/v201209/ad_group_bid_modifier_service.rb +38 -0
- data/lib/adwords_api/v201209/ad_group_bid_modifier_service_registry.rb +46 -0
- data/lib/adwords_api/v201302/ad_group_bid_modifier_service.rb +38 -0
- data/lib/adwords_api/v201302/ad_group_bid_modifier_service_registry.rb +46 -0
- data/lib/adwords_api/version.rb +1 -1
- data/test/examples/v201302/test_advanced_operations.rb +17 -0
- data/test/examples/v201302/test_campaign_management.rb +0 -8
- data/test/examples/v201302/test_migration.rb +49 -0
- data/test/templates/v201209/basic_operations_get_campaigns.def +1 -1
- data/test/templates/v201302/basic_operations_get_campaigns.def +1 -1
- data/test/templates/v201302/misc_use_oauth2_jwt.def +1 -1
- metadata +11 -3
data/ChangeLog
CHANGED
@@ -0,0 +1,97 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Encoding: utf-8
|
3
|
+
#
|
4
|
+
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
5
|
+
#
|
6
|
+
# Copyright:: Copyright 2013, 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 add an ad group level mobile bid modifier
|
22
|
+
# override for a campaign.
|
23
|
+
#
|
24
|
+
# Tags: AdGroupBidModifierService.mutate
|
25
|
+
|
26
|
+
require 'adwords_api'
|
27
|
+
|
28
|
+
def add_ad_group_bid_modifier(ad_group_id, bid_modifier)
|
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
|
+
bid_modifier_srv = adwords.service(:AdGroupBidModifierService, API_VERSION)
|
38
|
+
|
39
|
+
# Mobile criterion ID.
|
40
|
+
criterion_id = 30001
|
41
|
+
|
42
|
+
# Prepare to add an ad group level override.
|
43
|
+
operation = {
|
44
|
+
# Use 'ADD' to add a new modifier and 'SET' to update an existing one. A
|
45
|
+
# modifier can be removed with the 'REMOVE' operator.
|
46
|
+
:operator => 'ADD',
|
47
|
+
:operand => {
|
48
|
+
:ad_group_id => adgroup_id,
|
49
|
+
:criterion => {
|
50
|
+
:xsi_type => 'Platform',
|
51
|
+
:id => criterion_id
|
52
|
+
},
|
53
|
+
:bid_modifier => bid_modifier
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
# Add ad group level mobile bid modifier.
|
58
|
+
response = bid_modifier_srv.mutate([operation])
|
59
|
+
if response and response[:value]
|
60
|
+
modifier = response[:value].first
|
61
|
+
value = modifier[:bid_modifier] || 'unset'
|
62
|
+
puts ('Campaign ID %d, AdGroup ID %d, Criterion ID %d was updated with ' +
|
63
|
+
'ad group level modifier: %s') %
|
64
|
+
[modifier[:campaign_id], modifier[:ad_group_id],
|
65
|
+
modifier[:criterion][:id], value]
|
66
|
+
else
|
67
|
+
puts 'No modifiers were added.'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
if __FILE__ == $0
|
72
|
+
API_VERSION = :v201302
|
73
|
+
|
74
|
+
begin
|
75
|
+
# ID of an ad group to add an override for.
|
76
|
+
ad_group_id = 'INSERT_AD_GROUP_ID_HERE'.to_i
|
77
|
+
# Bid modifier to override with.
|
78
|
+
bid_modifier = 1.5
|
79
|
+
|
80
|
+
add_ad_group_bid_modifier(ad_group_id, bid_modifier)
|
81
|
+
|
82
|
+
# HTTP errors.
|
83
|
+
rescue AdsCommon::Errors::HttpError => e
|
84
|
+
puts "HTTP Error: %s" % e
|
85
|
+
|
86
|
+
# API errors.
|
87
|
+
rescue AdwordsApi::Errors::ApiException => e
|
88
|
+
puts "Message: %s" % e.message
|
89
|
+
puts 'Errors:'
|
90
|
+
e.errors.each_with_index do |error, index|
|
91
|
+
puts "\tError [%d]:" % (index + 1)
|
92
|
+
error.each do |field, value|
|
93
|
+
puts "\t\t%s: %s" % [field, value]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Encoding: utf-8
|
3
|
+
#
|
4
|
+
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
5
|
+
#
|
6
|
+
# Copyright:: Copyright 2013, 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 ad group level bid modifiers for a
|
22
|
+
# campaign.
|
23
|
+
#
|
24
|
+
# Tags: AdGroupBidModifierService.get
|
25
|
+
|
26
|
+
require 'adwords_api'
|
27
|
+
|
28
|
+
def get_ad_group_bid_modifiers(campaign_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
|
+
bid_modifier_srv = adwords.service(:AdGroupBidModifierService, API_VERSION)
|
38
|
+
|
39
|
+
# Get all ad group bid modifiers for the campaign.
|
40
|
+
selector = {
|
41
|
+
:fields => ['CampaignId', 'AdGroupId', 'Id', 'BidModifier'],
|
42
|
+
:predicates => [
|
43
|
+
{:field => 'CampaignId', :operator => 'EQUALS', :values => [campaign_id]}
|
44
|
+
],
|
45
|
+
:paging => {
|
46
|
+
:start_index => 0,
|
47
|
+
:number_results => PAGE_SIZE
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
# Set initial values.
|
52
|
+
offset, page = 0, {}
|
53
|
+
|
54
|
+
begin
|
55
|
+
page = bid_modifier_srv.get(selector)
|
56
|
+
if page[:entries]
|
57
|
+
page[:entries].each do |modifier|
|
58
|
+
value = modifier[:bid_modifier] || 'unset'
|
59
|
+
puts ('Campaign ID %d, AdGroup ID %d, Criterion ID %d has ad group ' +
|
60
|
+
'level modifier: %s') %
|
61
|
+
[modifier[:campaign_id], modifier[:ad_group_id],
|
62
|
+
modifier[:criterion][:id], value]
|
63
|
+
end
|
64
|
+
# Increment values to request the next page.
|
65
|
+
offset += PAGE_SIZE
|
66
|
+
selector[:paging][:start_index] = offset
|
67
|
+
else
|
68
|
+
puts 'No ad group level bid overrides returned.'
|
69
|
+
end
|
70
|
+
end while page[:total_num_entries] > offset
|
71
|
+
end
|
72
|
+
|
73
|
+
if __FILE__ == $0
|
74
|
+
API_VERSION = :v201302
|
75
|
+
PAGE_SIZE = 500
|
76
|
+
|
77
|
+
begin
|
78
|
+
# ID of a campaign to pull overrides for.
|
79
|
+
campaign_id = 'INSERT_CAMPAIGN_ID_HERE'.to_i
|
80
|
+
|
81
|
+
get_ad_group_bid_modifiers(campaign_id)
|
82
|
+
|
83
|
+
# HTTP errors.
|
84
|
+
rescue AdsCommon::Errors::HttpError => e
|
85
|
+
puts "HTTP Error: %s" % e
|
86
|
+
|
87
|
+
# API errors.
|
88
|
+
rescue AdwordsApi::Errors::ApiException => e
|
89
|
+
puts "Message: %s" % e.message
|
90
|
+
puts 'Errors:'
|
91
|
+
e.errors.each_with_index do |error, index|
|
92
|
+
puts "\tError [%d]:" % (index + 1)
|
93
|
+
error.each do |field, value|
|
94
|
+
puts "\t\t%s: %s" % [field, value]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
File without changes
|
@@ -0,0 +1,305 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Encoding: utf-8
|
3
|
+
#
|
4
|
+
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
5
|
+
#
|
6
|
+
# Copyright:: Copyright 2013, 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 migrates legacy sitelinks to upgraded sitelinks for a given list
|
22
|
+
# of campaigns. The campaigns must be upgraded to enhanced campaigns before you
|
23
|
+
# can run this example. To upgrade a campaign to enhanced, run
|
24
|
+
# set_campaign_enhanced.rb. To get all campaigns, run get_campaigns.rb.
|
25
|
+
#
|
26
|
+
# Tags: CampaignAdExtensionService.get, CampaignAdExtensionService.mutate
|
27
|
+
# Tags: FeedService.mutate, FeedItemService.mutate, FeedMappingService.mutate
|
28
|
+
# Tags: CampaignFeedService.mutate
|
29
|
+
|
30
|
+
require 'adwords_api'
|
31
|
+
|
32
|
+
def upgrade_legacy_sitelinks(campaign_ids)
|
33
|
+
# AdwordsApi::Api will read a config file from ENV['HOME']/adwords_api.yml
|
34
|
+
# when called without parameters.
|
35
|
+
adwords = AdwordsApi::Api.new
|
36
|
+
|
37
|
+
# To enable logging of SOAP requests, set the log_level value to 'DEBUG' in
|
38
|
+
# the configuration file or provide your own logger:
|
39
|
+
# adwords.logger = Logger.new('adwords_xml.log')
|
40
|
+
|
41
|
+
# Obtain the required services.
|
42
|
+
campaign_ad_extension_srv =
|
43
|
+
adwords.service(:CampaignAdExtensionService, API_VERSION)
|
44
|
+
feed_mapping_srv = adwords.service(:FeedMappingService, API_VERSION)
|
45
|
+
feed_srv = adwords.service(:FeedService, API_VERSION)
|
46
|
+
feed_item_srv = adwords.service(:FeedItemService, API_VERSION)
|
47
|
+
campaign_feed_srv = adwords.service(:CampaignFeedService, API_VERSION)
|
48
|
+
|
49
|
+
# Try to retrieve an existing feed that has been mapped for use with
|
50
|
+
# sitelinks. If multiple such feeds exist, the first matching feed is
|
51
|
+
# retrieved. You could modify this code example to retrieve all the feeds
|
52
|
+
# and pick the appropriate feed based on user input.
|
53
|
+
site_links_feed = get_existing_feed(feed_mapping_srv)
|
54
|
+
if site_links_feed.nil?
|
55
|
+
# Create a feed for storing sitelinks.
|
56
|
+
site_links_feed = create_site_links_feed(feed_srv)
|
57
|
+
# Map the feed for using with sitelinks.
|
58
|
+
create_site_links_feed_mapping(feed_mapping_srv, site_links_feed)
|
59
|
+
end
|
60
|
+
|
61
|
+
campaign_ids.each do |campaign_id|
|
62
|
+
# Get legacy extensions for the campaign.
|
63
|
+
legacy_extensions = get_legacy_extensions_for_campaign(
|
64
|
+
campaign_ad_extension_srv, campaign_id)
|
65
|
+
legacy_extensions.each do |extension|
|
66
|
+
# Get the sitelinks.
|
67
|
+
legacy_site_links = extension[:ad_extension][:sitelinks]
|
68
|
+
|
69
|
+
# Add the sitelinks to the feed.
|
70
|
+
site_link_feed_item_ids = create_site_link_feed_items(feed_item_srv,
|
71
|
+
site_links_feed,
|
72
|
+
legacy_site_links)
|
73
|
+
|
74
|
+
# Associate feeditems to the campaign.
|
75
|
+
associate_sitelink_feed_items_with_campaign(campaign_feed_srv,
|
76
|
+
site_links_feed,
|
77
|
+
site_link_feed_item_ids,
|
78
|
+
campaign_id)
|
79
|
+
|
80
|
+
# Once the upgraded sitelinks are added to a campaign, the legacy
|
81
|
+
# sitelinks will stop serving. You can delete the legacy sitelinks
|
82
|
+
# once you have verified that the migration went fine. In case the
|
83
|
+
# migration didn't succeed, you can roll back the migration by deleting
|
84
|
+
# the campaign feed you created in the previous step.
|
85
|
+
campaign_ad_extension_srv.mutate([
|
86
|
+
{:operator => 'REMOVE', :operand => extension}
|
87
|
+
])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Create a feed for holding upgraded sitelinks.
|
93
|
+
def create_site_links_feed(feed_srv)
|
94
|
+
# Create the feed.
|
95
|
+
site_links_feed = {
|
96
|
+
:name => 'Feed For Sitelinks',
|
97
|
+
:attributes => [
|
98
|
+
{:type => 'STRING', :name => 'Link Text'},
|
99
|
+
{:type => 'URL', :name => 'Link URL'}
|
100
|
+
],
|
101
|
+
:origin => 'USER'
|
102
|
+
}
|
103
|
+
|
104
|
+
# Add the feed.
|
105
|
+
response = feed_srv.mutate([
|
106
|
+
{:operator => 'ADD', :operand => site_links_feed}
|
107
|
+
])
|
108
|
+
|
109
|
+
saved_feed = response[:value].first
|
110
|
+
return {
|
111
|
+
:site_links_feed_id => saved_feed[:id],
|
112
|
+
:saved_attributes => saved_feed[:attributes],
|
113
|
+
:link_text_feed_attribute_id => saved_feed[:attributes][0][:id],
|
114
|
+
:link_url_feed_attribute_id => saved_feed[:attributes][1][:id]
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
# Map the feed for use with Sitelinks.
|
119
|
+
def create_site_links_feed_mapping(feed_mapping_srv, site_links_feed)
|
120
|
+
# Map the feedAttributeIds to the fieldId constants.
|
121
|
+
link_text_field_mapping = {
|
122
|
+
:feed_attribute_id => site_links_feed[:link_text_feed_attribute_id],
|
123
|
+
:field_id => PLACEHOLDER_FIELD_SITELINK_TEXT
|
124
|
+
}
|
125
|
+
link_url_field_mapping = {
|
126
|
+
:feed_attribute_id => site_links_feed[:link_url_feed_attribute_id],
|
127
|
+
:field_id => PLACEHOLDER_FIELD_SITELINK_URL
|
128
|
+
}
|
129
|
+
|
130
|
+
# Create the field mapping.
|
131
|
+
feed_mapping = {
|
132
|
+
:placeholder_type => PLACEHOLDER_SITELINKS,
|
133
|
+
:feed_id => site_links_feed[:site_links_feed_id],
|
134
|
+
:attribute_field_mappings =>
|
135
|
+
[link_text_field_mapping, link_url_field_mapping]
|
136
|
+
}
|
137
|
+
|
138
|
+
# Save the field mapping.
|
139
|
+
feed_mapping_srv.mutate([{:operator => 'ADD', :operand => feed_mapping}])
|
140
|
+
end
|
141
|
+
|
142
|
+
# Retrieves an existing feed that is mapped to hold sitelinks. The first active
|
143
|
+
# sitelinks feed is retrieved by this method.
|
144
|
+
def get_existing_feed(feed_mapping_srv)
|
145
|
+
selector = {
|
146
|
+
:fields => ['FeedId', 'FeedMappingId', 'PlaceholderType', 'Status',
|
147
|
+
'AttributeFieldMappings'],
|
148
|
+
:predicates => [
|
149
|
+
{
|
150
|
+
:field => 'PlaceholderType',
|
151
|
+
:operator => 'EQUALS',
|
152
|
+
:values => [PLACEHOLDER_SITELINKS]
|
153
|
+
},
|
154
|
+
{:field => 'Status', :operator => 'EQUALS', :values => ['ACTIVE']}
|
155
|
+
]
|
156
|
+
}
|
157
|
+
|
158
|
+
response = feed_mapping_srv.get(selector)
|
159
|
+
if response and response[:entries]
|
160
|
+
response[:entries].each do |feed_mapping|
|
161
|
+
feed_id = feed_mapping[:feed_id]
|
162
|
+
text_attribute_id = nil
|
163
|
+
url_attribute_id = nil
|
164
|
+
feed_mapping[:attribute_field_mappings].each do |attribute_mapping|
|
165
|
+
case attribute_mapping[:field_id].to_i
|
166
|
+
when PLACEHOLDER_FIELD_SITELINK_TEXT
|
167
|
+
text_attribute_id = attribute_mapping[:feed_attribute_id]
|
168
|
+
when PLACEHOLDER_FIELD_SITELINK_URL
|
169
|
+
url_attribute_id = attribute_mapping[:feed_attribute_id]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
unless feed_id.nil? or text_attribute_id.nil? or url_attribute_id.nil?
|
173
|
+
return {
|
174
|
+
:site_links_feed_id => feed_id,
|
175
|
+
:link_text_feed_attribute_id => text_attribute_id,
|
176
|
+
:link_url_feed_attribute_id => url_attribute_id
|
177
|
+
}
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
return nil
|
182
|
+
end
|
183
|
+
|
184
|
+
# Gets legacy sitelink extensions for a campaign.
|
185
|
+
def get_legacy_extensions_for_campaign(campaign_ad_extension_srv, campaign_id)
|
186
|
+
# Create the selector.
|
187
|
+
selector = {
|
188
|
+
:fields => ['CampaignId', 'AdExtensionId',
|
189
|
+
'Status', 'DisplayText', 'DestinationUrl'],
|
190
|
+
:predicates => [
|
191
|
+
# Filter the results for specified campaign id.
|
192
|
+
{:field => 'CampaignId', :operator => 'EQUALS', :values => [campaign_id]},
|
193
|
+
# Filter the results for active campaign ad extensions. You may add
|
194
|
+
# additional filtering conditions here as required.
|
195
|
+
{:field => 'Status', :operator => 'EQUALS', :values => ['ACTIVE']},
|
196
|
+
{
|
197
|
+
:field => 'AdExtensionType',
|
198
|
+
:operator => 'EQUALS',
|
199
|
+
:values => ['SITELINKS_EXTENSION']
|
200
|
+
}
|
201
|
+
]
|
202
|
+
}
|
203
|
+
response = campaign_ad_extension_srv.get(selector)
|
204
|
+
return (response and response[:entries]) ? response[:entries] : []
|
205
|
+
end
|
206
|
+
|
207
|
+
# Adds legacy sitelinks to the sitelinks feed.
|
208
|
+
def create_site_link_feed_items(feed_item_srv, site_links_feed, site_links)
|
209
|
+
# Create operation for adding each legacy sitelink to the sitelinks feed.
|
210
|
+
feed_item_operations = site_links.map do |site_link|
|
211
|
+
{
|
212
|
+
:operator => 'ADD',
|
213
|
+
:operand => {
|
214
|
+
:feed_id => site_links_feed[:site_links_feed_id],
|
215
|
+
:attribute_values => [
|
216
|
+
{
|
217
|
+
:feed_attribute_id => site_links_feed[:link_text_feed_attribute_id],
|
218
|
+
:string_value => site_link[:display_text]
|
219
|
+
},
|
220
|
+
{
|
221
|
+
:feed_attribute_id => site_links_feed[:link_url_feed_attribute_id],
|
222
|
+
:string_value => site_link[:destination_url]
|
223
|
+
}
|
224
|
+
]
|
225
|
+
}
|
226
|
+
}
|
227
|
+
end
|
228
|
+
|
229
|
+
response = feed_item_srv.mutate(feed_item_operations);
|
230
|
+
# Retrieve the feed item ids.
|
231
|
+
site_link_feed_item_ids = response[:value].map {|item| item[:feed_item_id]}
|
232
|
+
return site_link_feed_item_ids
|
233
|
+
end
|
234
|
+
|
235
|
+
# Associates sitelink feed items with a campaign.
|
236
|
+
def associate_sitelink_feed_items_with_campaign(campaign_feed_srv,
|
237
|
+
site_links_feed, site_link_feed_item_ids, campaign_id)
|
238
|
+
# Create a custom matching function that matches the given feed items to the
|
239
|
+
# campaign.
|
240
|
+
request_context_operand = {
|
241
|
+
:xsi_type => 'RequestContextOperand',
|
242
|
+
:context_type => 'FEED_ITEM_ID'
|
243
|
+
}
|
244
|
+
|
245
|
+
operands = site_link_feed_item_ids.map do |feed_item_id|
|
246
|
+
{
|
247
|
+
:xsi_type => 'ConstantOperand',
|
248
|
+
:long_value => feed_item_id,
|
249
|
+
:type => 'LONG'
|
250
|
+
}
|
251
|
+
end
|
252
|
+
|
253
|
+
function = {
|
254
|
+
:operator => 'IN',
|
255
|
+
:lhs_operand => [request_context_operand],
|
256
|
+
:rhs_operand => operands
|
257
|
+
}
|
258
|
+
|
259
|
+
# Create upgraded sitelinks for the campaign. Use the sitelinks feed we
|
260
|
+
# created, and restrict feed items by matching function.
|
261
|
+
campaign_feed = {
|
262
|
+
:feed_id => site_links_feed[:site_links_feed_id],
|
263
|
+
:campaign_id => campaign_id,
|
264
|
+
:matching_function => function,
|
265
|
+
:placeholder_types => [PLACEHOLDER_SITELINKS]
|
266
|
+
}
|
267
|
+
|
268
|
+
campaign_feed_srv.mutate([{:operator => 'ADD', :operand => campaign_feed}])
|
269
|
+
end
|
270
|
+
|
271
|
+
if __FILE__ == $0
|
272
|
+
API_VERSION = :v201302
|
273
|
+
|
274
|
+
# See the Placeholder reference page for a list of all the placeholder types
|
275
|
+
# and fields, see:
|
276
|
+
# https://developers.google.com/adwords/api/docs/appendix/placeholders
|
277
|
+
PLACEHOLDER_SITELINKS = 1
|
278
|
+
PLACEHOLDER_FIELD_SITELINK_TEXT = 1
|
279
|
+
PLACEHOLDER_FIELD_SITELINK_URL = 2
|
280
|
+
|
281
|
+
begin
|
282
|
+
# IDs of campaigns to add upgrade legacy sitelinks for.
|
283
|
+
campaign_ids = [
|
284
|
+
'INSERT_CAMPAIGN_ID_HERE'.to_i,
|
285
|
+
'INSERT_CAMPAIGN_ID_HERE'.to_i
|
286
|
+
]
|
287
|
+
|
288
|
+
upgrade_legacy_sitelinks(campaign_ids)
|
289
|
+
|
290
|
+
# HTTP errors.
|
291
|
+
rescue AdsCommon::Errors::HttpError => e
|
292
|
+
puts "HTTP Error: %s" % e
|
293
|
+
|
294
|
+
# API errors.
|
295
|
+
rescue AdwordsApi::Errors::ApiException => e
|
296
|
+
puts "Message: %s" % e.message
|
297
|
+
puts 'Errors:'
|
298
|
+
e.errors.each_with_index do |error, index|
|
299
|
+
puts "\tError [%d]:" % (index + 1)
|
300
|
+
error.each do |field, value|
|
301
|
+
puts "\t\t%s: %s" % [field, value]
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
@@ -48,6 +48,7 @@ module AdwordsApi
|
|
48
48
|
:v201209 => [
|
49
49
|
:AdExtensionOverrideService,
|
50
50
|
:AdGroupAdService,
|
51
|
+
:AdGroupBidModifierService,
|
51
52
|
:AdGroupCriterionService,
|
52
53
|
:AdGroupService,
|
53
54
|
:AdParamService,
|
@@ -84,6 +85,7 @@ module AdwordsApi
|
|
84
85
|
:v201302 => [
|
85
86
|
:AdExtensionOverrideService,
|
86
87
|
:AdGroupAdService,
|
88
|
+
:AdGroupBidModifierService,
|
87
89
|
:AdGroupCriterionService,
|
88
90
|
:AdGroupFeedService,
|
89
91
|
:AdGroupService,
|
@@ -135,6 +137,7 @@ module AdwordsApi
|
|
135
137
|
# v201209
|
136
138
|
[:v201209, :AdExtensionOverrideService] => 'cm/',
|
137
139
|
[:v201209, :AdGroupAdService] => 'cm/',
|
140
|
+
[:v201209, :AdGroupBidModifierService] => 'cm/',
|
138
141
|
[:v201209, :AdGroupCriterionService] => 'cm/',
|
139
142
|
[:v201209, :AdGroupService] => 'cm/',
|
140
143
|
[:v201209, :AdParamService] => 'cm/',
|
@@ -170,6 +173,7 @@ module AdwordsApi
|
|
170
173
|
# v201302
|
171
174
|
[:v201302, :AdExtensionOverrideService] => 'cm/',
|
172
175
|
[:v201302, :AdGroupAdService] => 'cm/',
|
176
|
+
[:v201302, :AdGroupBidModifierService] => 'cm/',
|
173
177
|
[:v201302, :AdGroupCriterionService] => 'cm/',
|
174
178
|
[:v201302, :AdGroupFeedService] => 'cm/',
|
175
179
|
[:v201302, :AdGroupService] => 'cm/',
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
#
|
3
|
+
# This is auto-generated code, changes will be overwritten.
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
|
6
|
+
# License:: Licensed under the Apache License, Version 2.0.
|
7
|
+
#
|
8
|
+
# Code generated by AdsCommon library 0.9.3 on 2013-05-06 15:27:10.
|
9
|
+
|
10
|
+
require 'ads_common/savon_service'
|
11
|
+
require 'adwords_api/v201209/ad_group_bid_modifier_service_registry'
|
12
|
+
|
13
|
+
module AdwordsApi; module V201209; module AdGroupBidModifierService
|
14
|
+
class AdGroupBidModifierService < AdsCommon::SavonService
|
15
|
+
def initialize(config, endpoint)
|
16
|
+
namespace = 'https://adwords.google.com/api/adwords/cm/v201209'
|
17
|
+
super(config, endpoint, namespace, :v201209)
|
18
|
+
end
|
19
|
+
|
20
|
+
def get(*args, &block)
|
21
|
+
return execute_action('get', args, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def mutate(*args, &block)
|
25
|
+
return execute_action('mutate', args, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def get_service_registry()
|
31
|
+
return AdGroupBidModifierServiceRegistry
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_module()
|
35
|
+
return AdwordsApi::V201209::AdGroupBidModifierService
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end; end; end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
#
|
3
|
+
# This is auto-generated code, changes will be overwritten.
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
|
6
|
+
# License:: Licensed under the Apache License, Version 2.0.
|
7
|
+
#
|
8
|
+
# Code generated by AdsCommon library 0.9.3 on 2013-05-06 15:27:10.
|
9
|
+
|
10
|
+
require 'adwords_api/errors'
|
11
|
+
|
12
|
+
module AdwordsApi; module V201209; module AdGroupBidModifierService
|
13
|
+
class AdGroupBidModifierServiceRegistry
|
14
|
+
ADGROUPBIDMODIFIERSERVICE_METHODS = {:get=>{:input=>[{:name=>:selector, :type=>"Selector", :min_occurs=>0, :max_occurs=>1}], :output=>{:name=>"get_response", :fields=>[{:name=>:rval, :type=>"AdGroupBidModifierPage", :min_occurs=>0, :max_occurs=>1}]}}, :mutate=>{:input=>[{:name=>:operations, :type=>"AdGroupBidModifierOperation", :min_occurs=>0, :max_occurs=>:unbounded}], :output=>{:name=>"mutate_response", :fields=>[{:name=>:rval, :type=>"AdGroupBidModifierReturnValue", :min_occurs=>0, :max_occurs=>1}]}}}
|
15
|
+
ADGROUPBIDMODIFIERSERVICE_TYPES = {:AuthenticationError=>{:fields=>[{:name=>:reason, :type=>"AuthenticationError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :AuthorizationError=>{:fields=>[{:name=>:reason, :type=>"AuthorizationError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :ClientTermsError=>{:fields=>[{:name=>:reason, :type=>"ClientTermsError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :CriterionError=>{:fields=>[{:name=>:reason, :type=>"CriterionError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :DateRange=>{:fields=>[{:name=>:min, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:max, :type=>"string", :min_occurs=>0, :max_occurs=>1}]}, :EntityNotFound=>{:fields=>[{:name=>:reason, :type=>"EntityNotFound.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :InternalApiError=>{:fields=>[{:name=>:reason, :type=>"InternalApiError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :NotWhitelistedError=>{:fields=>[{:name=>:reason, :type=>"NotWhitelistedError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :OperatorError=>{:fields=>[{:name=>:reason, :type=>"OperatorError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :OrderBy=>{:fields=>[{:name=>:field, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:sort_order, :type=>"SortOrder", :min_occurs=>0, :max_occurs=>1}]}, :Paging=>{:fields=>[{:name=>:start_index, :type=>"int", :min_occurs=>0, :max_occurs=>1}, {:name=>:number_results, :type=>"int", :min_occurs=>0, :max_occurs=>1}]}, :Platform=>{:fields=>[{:name=>:platform_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}], :base=>"Criterion"}, :Predicate=>{:fields=>[{:name=>:field, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:operator, :type=>"Predicate.Operator", :min_occurs=>0, :max_occurs=>1}, {:name=>:values, :type=>"string", :min_occurs=>0, :max_occurs=>:unbounded}]}, :QuotaCheckError=>{:fields=>[{:name=>:reason, :type=>"QuotaCheckError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :RateExceededError=>{:fields=>[{:name=>:reason, :type=>"RateExceededError.Reason", :min_occurs=>0, :max_occurs=>1}, {:name=>:rate_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:rate_scope, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:retry_after_seconds, :type=>"int", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :RequestError=>{:fields=>[{:name=>:reason, :type=>"RequestError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :SelectorError=>{:fields=>[{:name=>:reason, :type=>"SelectorError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :SizeLimitError=>{:fields=>[{:name=>:reason, :type=>"SizeLimitError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :SoapHeader=>{:fields=>[{:name=>:auth_token, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:client_customer_id, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:developer_token, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:user_agent, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:validate_only, :type=>"boolean", :min_occurs=>0, :max_occurs=>1}, {:name=>:partial_failure, :type=>"boolean", :min_occurs=>0, :max_occurs=>1}]}, :SoapResponseHeader=>{:fields=>[{:name=>:request_id, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:service_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:method_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:operations, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:response_time, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:units, :type=>"long", :min_occurs=>0, :max_occurs=>1}]}, :DatabaseError=>{:fields=>[{:name=>:reason, :type=>"DatabaseError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :ApiError=>{:fields=>[{:name=>:field_path, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:trigger, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:error_string, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:api_error_type, :original_name=>"ApiError.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :ApiException=>{:fields=>[{:name=>:errors, :type=>"ApiError", :min_occurs=>0, :max_occurs=>:unbounded}], :base=>"ApplicationException"}, :ApplicationException=>{:fields=>[{:name=>:message, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:application_exception_type, :original_name=>"ApplicationException.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}]}, :Selector=>{:fields=>[{:name=>:fields, :type=>"string", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:predicates, :type=>"Predicate", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:date_range, :type=>"DateRange", :min_occurs=>0, :max_occurs=>1}, {:name=>:ordering, :type=>"OrderBy", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:paging, :type=>"Paging", :min_occurs=>0, :max_occurs=>1}]}, :Criterion=>{:fields=>[{:name=>:id, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:type, :type=>"Criterion.Type", :min_occurs=>0, :max_occurs=>1}, {:name=>:criterion_type, :original_name=>"Criterion.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}]}, :AdGroupBidModifier=>{:fields=>[{:name=>:campaign_id, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:ad_group_id, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:criterion, :type=>"Criterion", :min_occurs=>0, :max_occurs=>1}, {:name=>:bid_modifier, :type=>"double", :min_occurs=>0, :max_occurs=>1}, {:name=>:bid_modifier_source, :type=>"BidModifierSource", :min_occurs=>0, :max_occurs=>1}]}, :AdGroupBidModifierOperation=>{:fields=>[{:name=>:operand, :type=>"AdGroupBidModifier", :min_occurs=>0, :max_occurs=>1}], :base=>"Operation"}, :AdGroupBidModifierPage=>{:fields=>[{:name=>:entries, :type=>"AdGroupBidModifier", :min_occurs=>0, :max_occurs=>:unbounded}], :base=>"Page"}, :AdGroupBidModifierReturnValue=>{:fields=>[{:name=>:value, :type=>"AdGroupBidModifier", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:partial_failure_errors, :type=>"ApiError", :min_occurs=>0, :max_occurs=>:unbounded}], :base=>"ListReturnValue"}, :ListReturnValue=>{:fields=>[{:name=>:list_return_value_type, :original_name=>"ListReturnValue.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :Operation=>{:fields=>[{:name=>:operator, :type=>"Operator", :min_occurs=>0, :max_occurs=>1}, {:name=>:operation_type, :original_name=>"Operation.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :Page=>{:fields=>[{:name=>:total_num_entries, :type=>"int", :min_occurs=>0, :max_occurs=>1}, {:name=>:page_type, :original_name=>"Page.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :"AuthenticationError.Reason"=>{:fields=>[]}, :"AuthorizationError.Reason"=>{:fields=>[]}, :BidModifierSource=>{:fields=>[]}, :"ClientTermsError.Reason"=>{:fields=>[]}, :"Criterion.Type"=>{:fields=>[]}, :"CriterionError.Reason"=>{:fields=>[]}, :"DatabaseError.Reason"=>{:fields=>[]}, :"EntityNotFound.Reason"=>{:fields=>[]}, :"InternalApiError.Reason"=>{:fields=>[]}, :"NotWhitelistedError.Reason"=>{:fields=>[]}, :Operator=>{:fields=>[]}, :"OperatorError.Reason"=>{:fields=>[]}, :"Predicate.Operator"=>{:fields=>[]}, :"QuotaCheckError.Reason"=>{:fields=>[]}, :"RateExceededError.Reason"=>{:fields=>[]}, :"RequestError.Reason"=>{:fields=>[]}, :"SelectorError.Reason"=>{:fields=>[]}, :"SizeLimitError.Reason"=>{:fields=>[]}, :SortOrder=>{:fields=>[]}}
|
16
|
+
ADGROUPBIDMODIFIERSERVICE_NAMESPACES = []
|
17
|
+
|
18
|
+
def self.get_method_signature(method_name)
|
19
|
+
return ADGROUPBIDMODIFIERSERVICE_METHODS[method_name.to_sym]
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_type_signature(type_name)
|
23
|
+
return ADGROUPBIDMODIFIERSERVICE_TYPES[type_name.to_sym]
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.get_namespace(index)
|
27
|
+
return ADGROUPBIDMODIFIERSERVICE_NAMESPACES[index]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Base class for exceptions.
|
32
|
+
class ApplicationException < AdwordsApi::Errors::ApiException
|
33
|
+
attr_reader :message # string
|
34
|
+
attr_reader :application_exception_type # string
|
35
|
+
end
|
36
|
+
|
37
|
+
# Exception class for holding a list of service errors.
|
38
|
+
class ApiException < ApplicationException
|
39
|
+
attr_reader :errors # ApiError
|
40
|
+
def initialize(exception_fault)
|
41
|
+
@array_fields ||= []
|
42
|
+
@array_fields << 'errors'
|
43
|
+
super(exception_fault, AdGroupBidModifierServiceRegistry)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end; end; end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
#
|
3
|
+
# This is auto-generated code, changes will be overwritten.
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
|
6
|
+
# License:: Licensed under the Apache License, Version 2.0.
|
7
|
+
#
|
8
|
+
# Code generated by AdsCommon library 0.9.3 on 2013-05-06 15:27:50.
|
9
|
+
|
10
|
+
require 'ads_common/savon_service'
|
11
|
+
require 'adwords_api/v201302/ad_group_bid_modifier_service_registry'
|
12
|
+
|
13
|
+
module AdwordsApi; module V201302; module AdGroupBidModifierService
|
14
|
+
class AdGroupBidModifierService < AdsCommon::SavonService
|
15
|
+
def initialize(config, endpoint)
|
16
|
+
namespace = 'https://adwords.google.com/api/adwords/cm/v201302'
|
17
|
+
super(config, endpoint, namespace, :v201302)
|
18
|
+
end
|
19
|
+
|
20
|
+
def get(*args, &block)
|
21
|
+
return execute_action('get', args, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def mutate(*args, &block)
|
25
|
+
return execute_action('mutate', args, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def get_service_registry()
|
31
|
+
return AdGroupBidModifierServiceRegistry
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_module()
|
35
|
+
return AdwordsApi::V201302::AdGroupBidModifierService
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end; end; end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
#
|
3
|
+
# This is auto-generated code, changes will be overwritten.
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2013, Google Inc. All Rights Reserved.
|
6
|
+
# License:: Licensed under the Apache License, Version 2.0.
|
7
|
+
#
|
8
|
+
# Code generated by AdsCommon library 0.9.3 on 2013-05-06 15:27:50.
|
9
|
+
|
10
|
+
require 'adwords_api/errors'
|
11
|
+
|
12
|
+
module AdwordsApi; module V201302; module AdGroupBidModifierService
|
13
|
+
class AdGroupBidModifierServiceRegistry
|
14
|
+
ADGROUPBIDMODIFIERSERVICE_METHODS = {:get=>{:input=>[{:name=>:selector, :type=>"Selector", :min_occurs=>0, :max_occurs=>1}], :output=>{:name=>"get_response", :fields=>[{:name=>:rval, :type=>"AdGroupBidModifierPage", :min_occurs=>0, :max_occurs=>1}]}}, :mutate=>{:input=>[{:name=>:operations, :type=>"AdGroupBidModifierOperation", :min_occurs=>0, :max_occurs=>:unbounded}], :output=>{:name=>"mutate_response", :fields=>[{:name=>:rval, :type=>"AdGroupBidModifierReturnValue", :min_occurs=>0, :max_occurs=>1}]}}}
|
15
|
+
ADGROUPBIDMODIFIERSERVICE_TYPES = {:AuthenticationError=>{:fields=>[{:name=>:reason, :type=>"AuthenticationError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :AuthorizationError=>{:fields=>[{:name=>:reason, :type=>"AuthorizationError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :ClientTermsError=>{:fields=>[{:name=>:reason, :type=>"ClientTermsError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :CriterionError=>{:fields=>[{:name=>:reason, :type=>"CriterionError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :DateRange=>{:fields=>[{:name=>:min, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:max, :type=>"string", :min_occurs=>0, :max_occurs=>1}]}, :DistinctError=>{:fields=>[{:name=>:reason, :type=>"DistinctError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :EntityNotFound=>{:fields=>[{:name=>:reason, :type=>"EntityNotFound.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :IdError=>{:fields=>[{:name=>:reason, :type=>"IdError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :InternalApiError=>{:fields=>[{:name=>:reason, :type=>"InternalApiError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :NotWhitelistedError=>{:fields=>[{:name=>:reason, :type=>"NotWhitelistedError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :OperatorError=>{:fields=>[{:name=>:reason, :type=>"OperatorError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :OrderBy=>{:fields=>[{:name=>:field, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:sort_order, :type=>"SortOrder", :min_occurs=>0, :max_occurs=>1}]}, :Paging=>{:fields=>[{:name=>:start_index, :type=>"int", :min_occurs=>0, :max_occurs=>1}, {:name=>:number_results, :type=>"int", :min_occurs=>0, :max_occurs=>1}]}, :Platform=>{:fields=>[{:name=>:platform_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}], :base=>"Criterion"}, :Predicate=>{:fields=>[{:name=>:field, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:operator, :type=>"Predicate.Operator", :min_occurs=>0, :max_occurs=>1}, {:name=>:values, :type=>"string", :min_occurs=>0, :max_occurs=>:unbounded}]}, :QuotaCheckError=>{:fields=>[{:name=>:reason, :type=>"QuotaCheckError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :RangeError=>{:fields=>[{:name=>:reason, :type=>"RangeError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :RateExceededError=>{:fields=>[{:name=>:reason, :type=>"RateExceededError.Reason", :min_occurs=>0, :max_occurs=>1}, {:name=>:rate_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:rate_scope, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:retry_after_seconds, :type=>"int", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :ReadOnlyError=>{:fields=>[{:name=>:reason, :type=>"ReadOnlyError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :RequestError=>{:fields=>[{:name=>:reason, :type=>"RequestError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :RequiredError=>{:fields=>[{:name=>:reason, :type=>"RequiredError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :SelectorError=>{:fields=>[{:name=>:reason, :type=>"SelectorError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :SizeLimitError=>{:fields=>[{:name=>:reason, :type=>"SizeLimitError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :SoapHeader=>{:fields=>[{:name=>:auth_token, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:client_customer_id, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:developer_token, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:user_agent, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:validate_only, :type=>"boolean", :min_occurs=>0, :max_occurs=>1}, {:name=>:partial_failure, :type=>"boolean", :min_occurs=>0, :max_occurs=>1}]}, :SoapResponseHeader=>{:fields=>[{:name=>:request_id, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:service_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:method_name, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:operations, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:response_time, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:units, :type=>"long", :min_occurs=>0, :max_occurs=>1}]}, :StringLengthError=>{:fields=>[{:name=>:reason, :type=>"StringLengthError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :DatabaseError=>{:fields=>[{:name=>:reason, :type=>"DatabaseError.Reason", :min_occurs=>0, :max_occurs=>1}], :base=>"ApiError"}, :ApiError=>{:fields=>[{:name=>:field_path, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:trigger, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:error_string, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:api_error_type, :original_name=>"ApiError.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :ApiException=>{:fields=>[{:name=>:errors, :type=>"ApiError", :min_occurs=>0, :max_occurs=>:unbounded}], :base=>"ApplicationException"}, :ApplicationException=>{:fields=>[{:name=>:message, :type=>"string", :min_occurs=>0, :max_occurs=>1}, {:name=>:application_exception_type, :original_name=>"ApplicationException.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}]}, :Selector=>{:fields=>[{:name=>:fields, :type=>"string", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:predicates, :type=>"Predicate", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:date_range, :type=>"DateRange", :min_occurs=>0, :max_occurs=>1}, {:name=>:ordering, :type=>"OrderBy", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:paging, :type=>"Paging", :min_occurs=>0, :max_occurs=>1}]}, :Criterion=>{:fields=>[{:name=>:id, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:type, :type=>"Criterion.Type", :min_occurs=>0, :max_occurs=>1}, {:name=>:criterion_type, :original_name=>"Criterion.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}]}, :AdGroupBidModifier=>{:fields=>[{:name=>:campaign_id, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:ad_group_id, :type=>"long", :min_occurs=>0, :max_occurs=>1}, {:name=>:criterion, :type=>"Criterion", :min_occurs=>0, :max_occurs=>1}, {:name=>:bid_modifier, :type=>"double", :min_occurs=>0, :max_occurs=>1}, {:name=>:bid_modifier_source, :type=>"BidModifierSource", :min_occurs=>0, :max_occurs=>1}]}, :AdGroupBidModifierOperation=>{:fields=>[{:name=>:operand, :type=>"AdGroupBidModifier", :min_occurs=>0, :max_occurs=>1}], :base=>"Operation"}, :AdGroupBidModifierPage=>{:fields=>[{:name=>:entries, :type=>"AdGroupBidModifier", :min_occurs=>0, :max_occurs=>:unbounded}], :base=>"Page"}, :AdGroupBidModifierReturnValue=>{:fields=>[{:name=>:value, :type=>"AdGroupBidModifier", :min_occurs=>0, :max_occurs=>:unbounded}, {:name=>:partial_failure_errors, :type=>"ApiError", :min_occurs=>0, :max_occurs=>:unbounded}], :base=>"ListReturnValue"}, :ListReturnValue=>{:fields=>[{:name=>:list_return_value_type, :original_name=>"ListReturnValue.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :Operation=>{:fields=>[{:name=>:operator, :type=>"Operator", :min_occurs=>0, :max_occurs=>1}, {:name=>:operation_type, :original_name=>"Operation.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :Page=>{:fields=>[{:name=>:total_num_entries, :type=>"int", :min_occurs=>0, :max_occurs=>1}, {:name=>:page_type, :original_name=>"Page.Type", :type=>"string", :min_occurs=>0, :max_occurs=>1}], :abstract=>true}, :"AuthenticationError.Reason"=>{:fields=>[]}, :"AuthorizationError.Reason"=>{:fields=>[]}, :BidModifierSource=>{:fields=>[]}, :"ClientTermsError.Reason"=>{:fields=>[]}, :"Criterion.Type"=>{:fields=>[]}, :"CriterionError.Reason"=>{:fields=>[]}, :"DatabaseError.Reason"=>{:fields=>[]}, :"DistinctError.Reason"=>{:fields=>[]}, :"EntityNotFound.Reason"=>{:fields=>[]}, :"IdError.Reason"=>{:fields=>[]}, :"InternalApiError.Reason"=>{:fields=>[]}, :"NotWhitelistedError.Reason"=>{:fields=>[]}, :Operator=>{:fields=>[]}, :"OperatorError.Reason"=>{:fields=>[]}, :"Predicate.Operator"=>{:fields=>[]}, :"QuotaCheckError.Reason"=>{:fields=>[]}, :"RangeError.Reason"=>{:fields=>[]}, :"RateExceededError.Reason"=>{:fields=>[]}, :"ReadOnlyError.Reason"=>{:fields=>[]}, :"RequestError.Reason"=>{:fields=>[]}, :"RequiredError.Reason"=>{:fields=>[]}, :"SelectorError.Reason"=>{:fields=>[]}, :"SizeLimitError.Reason"=>{:fields=>[]}, :SortOrder=>{:fields=>[]}, :"StringLengthError.Reason"=>{:fields=>[]}}
|
16
|
+
ADGROUPBIDMODIFIERSERVICE_NAMESPACES = []
|
17
|
+
|
18
|
+
def self.get_method_signature(method_name)
|
19
|
+
return ADGROUPBIDMODIFIERSERVICE_METHODS[method_name.to_sym]
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_type_signature(type_name)
|
23
|
+
return ADGROUPBIDMODIFIERSERVICE_TYPES[type_name.to_sym]
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.get_namespace(index)
|
27
|
+
return ADGROUPBIDMODIFIERSERVICE_NAMESPACES[index]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Base class for exceptions.
|
32
|
+
class ApplicationException < AdwordsApi::Errors::ApiException
|
33
|
+
attr_reader :message # string
|
34
|
+
attr_reader :application_exception_type # string
|
35
|
+
end
|
36
|
+
|
37
|
+
# Exception class for holding a list of service errors.
|
38
|
+
class ApiException < ApplicationException
|
39
|
+
attr_reader :errors # ApiError
|
40
|
+
def initialize(exception_fault)
|
41
|
+
@array_fields ||= []
|
42
|
+
@array_fields << 'errors'
|
43
|
+
super(exception_fault, AdGroupBidModifierServiceRegistry)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end; end; end
|
data/lib/adwords_api/version.rb
CHANGED
@@ -26,6 +26,8 @@ require 'advanced_operations/add_site_links'
|
|
26
26
|
require 'advanced_operations/add_click_to_download_ad'
|
27
27
|
require 'advanced_operations/create_and_attach_shared_keyword_set'
|
28
28
|
require 'advanced_operations/find_and_remove_criteria_from_shared_set'
|
29
|
+
require 'advanced_operations/add_ad_group_bid_modifier'
|
30
|
+
require 'advanced_operations/get_ad_group_bid_modifiers'
|
29
31
|
|
30
32
|
PLACEHOLDER_SITELINKS = 1
|
31
33
|
PLACEHOLDER_FIELD_SITELINK_LINK_TEXT = 1
|
@@ -61,4 +63,19 @@ class TestAdvancedOperationsV201302 < Test::Unit::TestCase
|
|
61
63
|
create_and_attach_shared_keyword_set(campaign[:id])
|
62
64
|
find_and_remove_criteria_from_shared_set(campaign[:id])
|
63
65
|
end
|
66
|
+
|
67
|
+
def test_get_ad_group_bid_modifiers()
|
68
|
+
campaign = @utils.get_campaign()
|
69
|
+
assert_not_nil(campaign)
|
70
|
+
assert_not_nil(campaign[:id])
|
71
|
+
get_ad_group_bid_modifiers(campaign[:id])
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_add_ad_group_bid_modifier()
|
75
|
+
bid_modifier = 1.1
|
76
|
+
ad_group = @utils.get_ad_group()
|
77
|
+
assert_not_nil(ad_group)
|
78
|
+
assert_not_nil(ad_group[:id])
|
79
|
+
add_ad_group_bid_modifier(ad_group[:id], bid_modifier)
|
80
|
+
end
|
64
81
|
end
|
@@ -30,7 +30,6 @@ require 'campaign_management/get_all_disapproved_ads'
|
|
30
30
|
require 'campaign_management/get_all_disapproved_ads_with_awql'
|
31
31
|
require 'campaign_management/promote_experiment'
|
32
32
|
require 'campaign_management/set_ad_parameters'
|
33
|
-
require 'campaign_management/set_campaign_enhanced'
|
34
33
|
require 'campaign_management/set_criterion_bid_modifier'
|
35
34
|
require 'campaign_management/validate_text_ad'
|
36
35
|
|
@@ -117,13 +116,6 @@ class TestCampaignManagementV201302 < Test::Unit::TestCase
|
|
117
116
|
set_ad_parameters(ad_group[:id], criterion[:criterion][:id])
|
118
117
|
end
|
119
118
|
|
120
|
-
def test_set_campaign_enhanced()
|
121
|
-
campaign = @utils.get_campaign()
|
122
|
-
assert_not_nil(campaign)
|
123
|
-
assert_not_nil(campaign[:id])
|
124
|
-
set_campaign_enhanced(campaign[:id])
|
125
|
-
end
|
126
|
-
|
127
119
|
def test_set_criterion_bid_modifier()
|
128
120
|
campaign = @utils.get_campaign()
|
129
121
|
assert_not_nil(campaign)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Encoding: utf-8
|
3
|
+
#
|
4
|
+
# Author:: api.dklimkin@gmail.com (Danial Klimkin)
|
5
|
+
#
|
6
|
+
# Copyright:: Copyright 2013, 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
|
+
# Tests the migration examples.
|
22
|
+
|
23
|
+
require 'test/unit'
|
24
|
+
|
25
|
+
require 'migration/set_campaign_enhanced'
|
26
|
+
|
27
|
+
class TestMigrationV201302 < Test::Unit::TestCase
|
28
|
+
def setup
|
29
|
+
@logger = Logger.new(STDOUT)
|
30
|
+
@logger.level = Logger::ERROR
|
31
|
+
@adwords = AdwordsApi::Api.new
|
32
|
+
@adwords.logger = @logger
|
33
|
+
@utils = UtilsV201302.new(@adwords)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_set_campaign_enhanced()
|
37
|
+
campaign = @utils.get_campaign()
|
38
|
+
assert_not_nil(campaign)
|
39
|
+
assert_not_nil(campaign[:id])
|
40
|
+
set_campaign_enhanced(campaign[:id])
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_upgrade_legacy_sitelinks()
|
44
|
+
campaign = @utils.get_campaign()
|
45
|
+
assert_not_nil(campaign)
|
46
|
+
assert_not_nil(campaign[:id])
|
47
|
+
upgrade_legacy_sitelinks([campaign[:id]])
|
48
|
+
end
|
49
|
+
end
|
@@ -22,7 +22,7 @@ def setup_mocks()
|
|
22
22
|
{"env:Envelope"=>
|
23
23
|
{"env:Header"=>
|
24
24
|
{"wsdl:RequestHeader"=>
|
25
|
-
{"userAgent"=>"ruby-tests (AwApi-Ruby/0.9.
|
25
|
+
{"userAgent"=>"ruby-tests (AwApi-Ruby/0.9.1, Common-Ruby/0.9.3, Savon/1.2.0, ruby/1.9.3, HTTPI/1.1.1, net_http)",
|
26
26
|
"developerToken"=>"dev_token123",
|
27
27
|
"clientCustomerId"=>"123-456-7890",
|
28
28
|
"authToken"=>"abcAuthbcd",
|
@@ -22,7 +22,7 @@ def setup_mocks()
|
|
22
22
|
{"env:Envelope"=>
|
23
23
|
{"env:Header"=>
|
24
24
|
{"wsdl:RequestHeader"=>
|
25
|
-
{"userAgent"=>"ruby-tests (AwApi-Ruby/0.9.
|
25
|
+
{"userAgent"=>"ruby-tests (AwApi-Ruby/0.9.1, Common-Ruby/0.9.3, Savon/1.2.0, ruby/1.9.3, HTTPI/1.1.1, net_http)",
|
26
26
|
"developerToken"=>"dev_token123",
|
27
27
|
"clientCustomerId"=>"123-456-7890",
|
28
28
|
"authToken"=>"abcAuthbcd",
|
@@ -40,7 +40,7 @@ def setup_mocks()
|
|
40
40
|
{"env:Envelope"=>
|
41
41
|
{"env:Header"=>
|
42
42
|
{"wsdl:RequestHeader"=>
|
43
|
-
{"userAgent"=>"ruby-tests (AwApi-Ruby/0.9.
|
43
|
+
{"userAgent"=>"ruby-tests (AwApi-Ruby/0.9.1, Common-Ruby/0.9.3, Savon/1.2.0, ruby/1.9.3, HTTPI/1.1.1, net_http)",
|
44
44
|
"developerToken"=>"dev_token123",
|
45
45
|
"clientCustomerId"=>"123-456-7890",
|
46
46
|
"xmlns"=>"https://adwords.google.com/api/adwords/cm/v201302"}},
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-adwords-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-ads-common
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- lib/adwords_api/v201302/geo_location_service.rb
|
67
67
|
- lib/adwords_api/v201302/ad_group_criterion_service.rb
|
68
68
|
- lib/adwords_api/v201302/managed_customer_service.rb
|
69
|
+
- lib/adwords_api/v201302/ad_group_bid_modifier_service_registry.rb
|
69
70
|
- lib/adwords_api/v201302/user_list_service_registry.rb
|
70
71
|
- lib/adwords_api/v201302/constant_data_service_registry.rb
|
71
72
|
- lib/adwords_api/v201302/ad_group_ad_service.rb
|
@@ -106,6 +107,7 @@ files:
|
|
106
107
|
- lib/adwords_api/v201302/geo_location_service_registry.rb
|
107
108
|
- lib/adwords_api/v201302/targeting_idea_service_registry.rb
|
108
109
|
- lib/adwords_api/v201302/data_service.rb
|
110
|
+
- lib/adwords_api/v201302/ad_group_bid_modifier_service.rb
|
109
111
|
- lib/adwords_api/report_header_handler.rb
|
110
112
|
- lib/adwords_api/api_config.rb
|
111
113
|
- lib/adwords_api/errors.rb
|
@@ -137,6 +139,7 @@ files:
|
|
137
139
|
- lib/adwords_api/v201209/ad_group_criterion_service.rb
|
138
140
|
- lib/adwords_api/v201209/managed_customer_service.rb
|
139
141
|
- lib/adwords_api/v201209/video_targeting_group_criterion_service_registry.rb
|
142
|
+
- lib/adwords_api/v201209/ad_group_bid_modifier_service_registry.rb
|
140
143
|
- lib/adwords_api/v201209/video_campaign_service.rb
|
141
144
|
- lib/adwords_api/v201209/user_list_service_registry.rb
|
142
145
|
- lib/adwords_api/v201209/video_service_registry.rb
|
@@ -176,6 +179,7 @@ files:
|
|
176
179
|
- lib/adwords_api/v201209/geo_location_service_registry.rb
|
177
180
|
- lib/adwords_api/v201209/targeting_idea_service_registry.rb
|
178
181
|
- lib/adwords_api/v201209/data_service.rb
|
182
|
+
- lib/adwords_api/v201209/ad_group_bid_modifier_service.rb
|
179
183
|
- lib/adwords_api.rb
|
180
184
|
- test/suite_integration.rb
|
181
185
|
- test/examples/v201302/utils.rb
|
@@ -184,6 +188,7 @@ files:
|
|
184
188
|
- test/examples/v201302/test_misc.rb
|
185
189
|
- test/examples/v201302/test_remarketing.rb
|
186
190
|
- test/examples/v201302/test_account_management.rb
|
191
|
+
- test/examples/v201302/test_migration.rb
|
187
192
|
- test/examples/v201302/test_optimization.rb
|
188
193
|
- test/examples/v201302/test_reporting.rb
|
189
194
|
- test/examples/v201302/test_basic_operations.rb
|
@@ -237,7 +242,6 @@ files:
|
|
237
242
|
- examples/v201302/campaign_management/add_keywords_in_bulk.rb
|
238
243
|
- examples/v201302/campaign_management/promote_experiment.rb
|
239
244
|
- examples/v201302/campaign_management/get_all_disapproved_ads.rb
|
240
|
-
- examples/v201302/campaign_management/set_campaign_enhanced.rb
|
241
245
|
- examples/v201302/campaign_management/add_location_extension_override.rb
|
242
246
|
- examples/v201302/account_management/get_account_hierarchy.rb
|
243
247
|
- examples/v201302/account_management/get_account_changes.rb
|
@@ -268,10 +272,14 @@ files:
|
|
268
272
|
- examples/v201302/misc/use_oauth2_jwt.rb
|
269
273
|
- examples/v201302/misc/get_all_images_and_videos.rb
|
270
274
|
- examples/v201302/misc/use_oauth2.rb
|
275
|
+
- examples/v201302/migration/upgrade_legacy_sitelinks.rb
|
276
|
+
- examples/v201302/migration/set_campaign_enhanced.rb
|
271
277
|
- examples/v201302/remarketing/add_conversion_tracker.rb
|
272
278
|
- examples/v201302/remarketing/add_audience.rb
|
273
279
|
- examples/v201302/advanced_operations/add_site_links.rb
|
280
|
+
- examples/v201302/advanced_operations/get_ad_group_bid_modifiers.rb
|
274
281
|
- examples/v201302/advanced_operations/create_and_attach_shared_keyword_set.rb
|
282
|
+
- examples/v201302/advanced_operations/add_ad_group_bid_modifier.rb
|
275
283
|
- examples/v201302/advanced_operations/find_and_remove_criteria_from_shared_set.rb
|
276
284
|
- examples/v201302/advanced_operations/add_click_to_download_ad.rb
|
277
285
|
- examples/v201209/reporting/download_criteria_report.rb
|