3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[ruby] ad_manager_apiで様々な条件のクエリを発行する

Last updated at Posted at 2025-12-05

以前投稿した記事で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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?