/
add_expression_rule_user_list.rb
144 lines (130 loc) · 5.45 KB
/
add_expression_rule_user_list.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/env ruby
# Encoding: utf-8
#
# Copyright 2020 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.
#
# Creates a rule-based user list defined by an expression rule for users who
# have visited two different sections of a website.
require 'optparse'
require 'google/ads/google_ads'
require 'date'
# [START add_expression_rule_user_list]
def add_expression_rule_user_list(customer_id)
# GoogleAdsClient will read a config file from
# ENV['HOME']/google_ads_config.rb when called without parameters
client = Google::Ads::GoogleAds::GoogleAdsClient.new
# Creates a user list.
operation = client.operation.create_resource.user_list do |u|
u.name = "All visitors to example.com/section1 AND example.com/section2 #" \
"#{(Time.new.to_f * 1000).to_i}"
u.description = "Visitors of both example.com/section1 AND " \
"example.com/section2"
u.membership_status = :OPEN
u.membership_life_span = 365
# Defines a representation of a user list that is generated by a rule.
u.rule_based_user_list = client.resource.rule_based_user_list_info do |r|
# Optional: To include past users in the user list, set
# the prepopulation_status to REQUESTED.
r.prepopulation_status = :REQUESTED
# Creates an ExpressionRuleUserListInfo object, or a boolean rule that
# defines this user list. The default rule_type for a user_list_rule_info
# object is OR of ANDs (disjunctive normal form). That is, rule items will
# be ANDed together within rule item groups and the groups themselves will
# be ORed together.
r.expression_rule_user_list =
client.resource.expression_rule_user_list_info do |expr|
expr.rule = client.resource.user_list_rule_info do |info|
# Combines the two rule items into a UserListRuleItemGroupInfo object
# so Google Ads will AND their rules together. To instead OR the rules
# together, each rule should be placed in its own rule item group.
info.rule_item_groups << client.resource.user_list_rule_item_group_info do |group|
# Creates a rule targeting any user that visited a url that contains
# 'example.com/section1'.
group.rule_items << client.resource.user_list_rule_item_info do |item|
# Uses a built-in parameter to create a domain URL rule.
item.name = URL_STRING
item.string_rule_item = client.resource.user_list_string_rule_item_info do |string_rule|
string_rule.operator = :CONTAINS
string_rule.value = "example.com/section1"
end
end
# Creates a rule targeting any user that visited a url that contains
# 'example.com/section2'.
group.rule_items << client.resource.user_list_rule_item_info do |item|
# Uses a built-in parameter to create a domain URL rule.
item.name = URL_STRING
item.string_rule_item = client.resource.user_list_string_rule_item_info do |string_rule|
string_rule.operator = :CONTAINS
string_rule.value = "example.com/section2"
end
end
end
end
end
end
end
# Issues a mutate request to add the user list and prints some information.
response = client.service.user_list.mutate_user_lists(
customer_id: customer_id,
operations: [operation],
)
puts "Created user list with resource name " \
"#{response.results.first.resource_name}"
end
# [END add_expression_rule_user_list]
if __FILE__ == $0
URL_STRING = "url__"
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'
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.separator ''
opts.separator 'Help:'
opts.on_tail('-h', '--help', 'Show this message') do
puts opts
exit
end
end.parse!
begin
add_expression_rule_user_list(options.fetch(:customer_id).tr("-", ""))
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