以前投稿した記事でGoogle Ad Manager(GAM)のオーダーの情報をRubyを使って取得しました。
まずは前回作成したプログラムを再掲します。
特に条件はなく、特定のネットワークコードのGAMのオーダーを10件取得するだけのプログラムです。
# frozen_string_literal: true
require 'dotenv'
require 'ad_manager_api'
Dotenv.load
ad_manager = AdManagerApi::Api.new(
{
authentication: {
method: 'OAUTH2_SERVICE_ACCOUNT',
application_name: 'Ruby Ad Manager Sample',
oauth2_issuer: ENV['GOOGLE_AD_MANAGER_CLIENT_EMAIL'],
network_code: ENV['GOOGLE_AD_MANAGER_NETWORK_CODE'],
oauth2_key: OpenSSL::PKey::RSA.new(
ENV['GOOGLE_AD_MANAGER_PRIVATE_KEY'].gsub('\\n', "\n")
)
}
}
)
order_service = ad_manager.service(:OrderService, :v202508)
statement = ad_manager.new_statement_builder do |sb|
sb.limit = 10
end.to_statement
response = order_service.get_orders_by_statement(statement)
p response[:results]
今回はその記事で作成したプログラムを発展させて、より複雑な条件でオーダーを取得していきます。
○件取得する
こちらはサンプルプログラムですでに利用していますが。limitを設定します。
デフォルトは500です。
statement = ad_manager.new_statement_builder do |sb|
sb.limit = 10
end.to_statement
p statement
# {query: "LIMIT 10 OFFSET 0", values: []}
○番目から取得する
offsetを利用します。デフォルトは0です。
statement = ad_manager.new_statement_builder do |sb|
sb.offset = 10 # 最初の10件をスキップする
end.to_statement
p statement
# {query: "LIMIT 500 OFFSET 10", values: []}
limitと組み合わせて、分割取得をすることも可能です。
offset = 0
orders = []
LIMIT = 100
loop do
statement = ad_manager.new_statement_builder do |sb|
sb.limit = LIMIT
sb.offset = offset
end.to_statement
response = order_service.get_orders_by_statement(statement)
offset += LIMIT
orders += response[:results] || []
break if response[:results].nil? || response[:results].size < LIMIT
sleep 1 # 攻撃のようなリクエスト連打にならないようにsleepを置く
end
where検索
whereとwith_bind_variableを利用します。
statement = ad_manager.new_statement_builder do |sb|
sb.where = "name = :name"
sb.with_bind_variable("name", "テスト")
end.to_statement
p statement
# {query: "WHERE name = :name LIMIT 500 OFFSET 0", values: [{key: "name", value: {xsi_type: "TextValue", value: "テスト"}}]}
以下のようにして、直接変数を入力することも可能ですが、with_bind_variableを利用することで、クエリ内で変数を安全に使用することができます。
with_bind_variableを使いましょう。
statement = ad_manager.new_statement_builder do |sb|
sb.where = "name = 'テスト'"
end.to_statement
p statement
# {query: "WHERE name = 'テスト' LIMIT 500 OFFSET 0", values: []}
複数のwhereを使いたい場合は以下のように where 文を記述して、変数ごとにwith_bind_variableすると良いです。
statement = ad_manager.new_statement_builder do |sb|
sb.where = "name = :name_1 OR name = :name_2"
# 以下のような形で書いても良い
# sb.where = "name = :name_1"
# sb.where += " OR name = :name_2"
sb.with_bind_variable("name_1", "テスト")
sb.with_bind_variable("name_2", "別のテスト")
end.to_statement
p statement
{query: "WHERE name = :name_1 OR name = :name_2 LIMIT 500 OFFSET 0", values: [{key: "name_1", value: {xsi_type: "TextValue", value: "テスト"}}, {key: "name_2", value: {xsi_type: "TextValue", value: "別のテスト"}}]}
まとめ
ちょっとwhereなどはクセがありますが、基本的な動作はオプションで用意されています。
うまく組み合わせて必要な情報を取得できるようになりましょう。
ref
google-api-ads-ruby/ad_manager_api/examples at main · googleads/google-api-ads-ruby