
あれれ・・・なんでだ
同じ日付なのにデータが分かれてしまうぞ、、っ!

どうしました?

kabuさん・・・っ!
最近Google広告を始めたんですが、そのデータを「Google広告スクリプト」でスプレッドシートに落とそうとしたところ、思ったようにデータが取れなくて。。。

なるほど。
これはGoogle広告スクリプトの「FROM」句の沼にハマってしまったようですね。

では今回は
・「FROM」句とは
・データが分かれてしまう!?よくある「FROM」句のトラブル
・まとめ
ということで話していきたいと思います。
「FROM」句とは

「FROM」句とは、SQLでテーブルを指定する句(決まり文句、固定の書き方)になります。
Google広告スクリプトでは、SQLの書き方でデータを取得することができるため、この「FROM」句を使うことがあります。

え?・・・えと
・・・まず、SQLってなんでしょう??

SQLは、簡単にいうとデータベース(表組・テーブル形式にまとまったデータ群)を操作するための言語です。
広告のデータは、内部的にはテーブル(表組)のようにまとまっているので、SQLで取得するのに適しています。

「FROM」句という今回のテーマは、
Google広告スクリプト > SQL > 「FROM」句
という感じなので、かなりミクロな話しではありますね。
Google広告スクリプトで使用する、SQLの主な記載方法・構造
SELECT句

Google広告スクリプトで使うSQLの構造は、主に以下のような形で記載するケースが多いです。
SELECT segments.month, metrics.impressions FROM campaign WHERE metrics.impressions <> 0 ORDER BY segments.month DESC LIMIT 50
SELECT句では、出力する指標(segments や metrics)を指定します。
テーブル(表組)内の ”どの列” を出力するかSELECT句で指示するイメージです。
以下の指標はよく使いますね。
指標名 | 説明 | データの形 |
---|---|---|
campaign.name | キャンペーンの名前 | テキスト |
ad_group.name | 広告グループの名前 | テキスト |
gender_view.resource_name | 性別 「男性」、「女性」とかではない | テキスト 性別の識別ID |
age_range_view.resource_name | 年齢 「18歳」とか「35歳」とかではなく、「18〜25歳」などの年齢帯で出力される | テキスト 年齢の識別ID |
segments.device | デバイス 「mobile」、「PC」、「tablet」など | テキスト |
ad_group_criterion.keyword.text | 検索キーワード | テキスト |
search_term_view.search_term | 検索語句 | テキスト |
metrics.impressions | 表示回数 | 数値 |
metrics.clicks | クリック数 | 数値 |
metrics.conversions | コンバージョン数 | 数値 |
metrics.cost_micros | 利用金額 | 数値 一般的な数値の10^6されて出力される |

大きなテーブルがあって・・・
その中の “出力する列を指定する”・・・という感じのイメージでしょうか
上の表の「データの形」とはどういう意味ですか?

「データの形」は、その指標がどんな状態の値を持っているかを示しています。
「campaign.name」なら、Google広告に設定してあるキャンペーン名、例えば「女性向け販促キャンペーン」や「首都圏ターゲットキャンペーン」など、”テキスト(文字列)” で登録されているはずです。
対して「metrics.impressions」では「10,000」、「6,500」など、”数値” が保存されています。
「gender_view.resource_name」と「age_range_view.resource_name」は少し特殊で、それ独自のIDが割り振られています。
FROM句

続いて、本記事のメインテーマ「FROM」についてです。
SELECT segments.month, metrics.impressions FROM campaign WHERE metrics.impressions <> 0 ORDER BY segments.month DESC LIMIT 50

「FROM」句の後には「campaign」という文字が続いてますね。

はい。
「FROM」句では、数ある中から “どのテーブル(表組)” を選ぶかを指定しています。

え・・・
テーブルっていくつもあるんですか??
よく使うテーブル | 説明 |
---|---|
customer | アカウントの全体データがまとまっているテーブル |
campaign | キャンペーン単位でデータがまとまっているテーブル |
ad_group | 広告グループ単位でデータがまとまっているテーブル |
gender_view | 性別単位でデータがまとまっているテーブル |
age_range_view | 年齢単位でデータがまとまっているテーブル |
search_term_view | 検索語句ごとでデータがまとまっているテーブル |

よく使うテーブルの一例をまとめれば上の表のような感じです。
・・・例えば、家計簿のスプレッドシート を作ったとします。

え?はい??

そこには、
・支出のシート
・収入のシート
・固定費のシート
・貯蓄のシート
・収支をまとめたシート
と、色々なシートが、情報を流用しながら作成されているはずです。

Google広告でも同様に、色々なテーブルが、それぞれ情報を流用しながら存在しています。
・キャンペーンでまとめたテーブル
・広告グループでまとめたテーブル
・性別でまとめたテーブル
・年齢でまとめたテーブル
・全体の数値をまとめたテーブル
などですね。

なのでこの “テーブル” は、家計簿スプレッドシートの “シート” のことだと思ってもらえれば分かりやすいかと思います。
「FROM」句では、どのデータがまとまったテーブルを参照するかを指定しています。

あーなんとなく分かりました!
Google広告のデータは複数のテーブルにまとまっていて、「FROM」句でどれにするか選んでるってことですね!!
WHERE句

「WHERE」句は、フィルタのような機能を持っています。
SELECT segments.month, metrics.impressions FROM campaign WHERE metrics.impressions <> 0 ORDER BY segments.month DESC LIMIT 50

上のコードの場合だと、
「WHERE metrics.impressions <> 0」
すなわち
「表示回数が 0 以外のデータに抜粋して」
ということになります。
よく使う書き方 | 説明 |
---|---|
WHERE metrics.impressions <> 0 | 表示回数が0以外 |
WHERE metrics.conversions >= 1 | コンバージョン数が1以上 |
WHERE segments.device = ‘mobile’ | デバイスがスマホ |
WHERE segments.date DURING LAST_MONTH | 先月のデータ |
WHERE segments.date BETWEEN ‘2025-01-01’ AND ‘2025-01-31’ | 2025/1/1~20251/31までのデータ |

「WHERE」句で、データを絞り込むわけですね!
ORDER BY 句

「ORDER BY」句はソートの役割を持っています。
SELECT segments.month, metrics.impressions FROM campaign WHERE metrics.impressions <> 0 ORDER BY segments.month DESC LIMIT 50

上のコードの場合だと、
「ORDER BY segments.month DESC」
すなわち
「月で降順に並べて」
という意味になります。
よく使う書き方 | 説明 |
---|---|
ORDER BY ad_group.name ASC | データを広告グループ名で “昇順” に並べ替える |
ORDER BY metrics.impressions ASC | データを表示回数で “昇順” に並べ替える |
ORDER BY segments.month DESC | データを月で “降順” に並び替える |
ORDER BY campaign.name ASC, metrics.conversions DESC | キャンペーン名を昇順で並び替えた後、CV数の降順に並び替える |

なるほど!
・・・んん??最後のだけよく分からない!!

例を見てみましょう。
例えば、以下のようなテーブルがあるとします。
キャンペーン名 | 広告グループ名 | CV数 |
---|---|---|
キャンペーン東京 | グループA | 0 |
キャンペーン大阪 | グループB | 1 |
キャンペーン東京 | グループC | 2 |
キャンペーン大阪 | グループD | 3 |

これを以下内容の「ORDER BY」で並び替えます。
まずは 最初の並び替え 部分の動きをみてみます。
ORDER BY campaign.name ASC, metrics.conversions DESC
キャンペーン名 | 広告グループ名 | CV数 |
---|---|---|
キャンペーン大阪 ↑ | グループB | 1 |
キャンペーン大阪 ↑↑ | グループD | 3 |
キャンペーン東京 | グループA | 0 |
キャンペーン東京 | グループC | 2 |

するとキャンペーン名の昇順で並び替えられます。
ここまではいいですよね?

うん。
分かります!

続いて 後ろ側の並び替え の動きを見てみます。
ORDER BY campaign.name ASC, metrics.conversions DESC
キャンペーン名 | 広告グループ名 | CV数 |
---|---|---|
キャンペーン大阪 | グループD | 3 ↑ |
キャンペーン大阪 | グループB | 1 |
キャンペーン東京 | グループC | 2 ↑ |
キャンペーン東京 | グループA | 0 |

すると、キャンペーン名はソート済み(固定)なので、同キャンペーン内でCV数の降順に並び替えられます。
仕上がりは以下の形です。
キャンペーン名 | 広告グループ名 | CV数 |
---|---|---|
キャンペーン大阪 | グループD | 3 |
キャンペーン大阪 | グループB | 1 |
キャンペーン東京 | グループC | 2 |
キャンペーン東京 | グループA | 0 |

分かったような、分からないような笑
とにかく、最初の並び替えはベースとして動かず、次の並び替えは並び替えられた中で並び替えってことですね!
LIMIT 句

最後は「LIMIT」句ですね。
これは簡単です。
SELECT segments.month, metrics.impressions FROM campaign WHERE metrics.impressions <> 0 ORDER BY segments.month DESC LIMIT 50

・・・指定した件数のみ出力とか?

そうです。
「LIMIT」句の前の文までに処理されたデータを指定件数で抜粋する、といったところでしょうか。
上のコードの場合「50」件で抜粋(出力)ってことになります。
データが分かれてしまう!?よくある「FROM」句のトラブル

Google広告スクリプトでは、この「FROM」句が結構鬼門なようです。
「FROM」句の指定を間違えて、思ったようなデータを取れなかったり、プログラムがエラー などが起きてしまいます。

そうなんですよ!!
ようやく一番最初につながった?!
思ったようなデータを取り出せない
思ったようなデータが取り出せない場合、「FROM」句で指定しているテーブルが間違っている可能性があります。
例えば、月ごとの表示回数を取得したいと思います。
次のコードで、「FROM」句に「campaign」を指定して出力します。
SELECT segments.month, metrics.impressions FROM campaign WHERE metrics.impressions <> 0 ORDER BY segments.month DESC
すると出力されるデータは以下のようになります。
月 | 表示回数 |
---|---|
2025-02-01 | 1,432 |
2025-02-01 | 989 |
2025-01-01 | 1,218 |
2025-01-01 | 867 |
2024-12-01 | 1,331 |
2024-12-01 | 770 |
・・・ |

そうそう!
こんな感じで、同じ日付なのにデータが分かれちゃうんですよ!

これは、「FROM」句で指定している「campaign」テーブルには、そもそも複数のcampaignがあるためだと思われます。
(隠れているキャンペーン) | 月 | 表示回数 |
---|---|---|
キャンペーン東京 | 2025-02-01 | 1,432 |
キャンペーン大阪 | 2025-02-01 | 989 |
キャンペーン東京 | 2025-01-01 | 1,218 |
キャンペーン大阪 | 2025-01-01 | 867 |
キャンペーン東京 | 2024-12-01 | 1,331 |
キャンペーン大阪 | 2024-12-01 | 770 |
・・・ |

隠れている「campaign」列を表示するとこんな感じですね。
「FROM」句でこのテーブルを選択した場合、あくまでこのテーブルの中から、取得(表示・出力)する列を「SELECT」句で選択しているに過ぎないんですね。

あ、そういうことなんですか!

なので、月でまとめたデータを取得したい場合は、「FROM」句には「customer」を指定するのが正しいです。
SELECT segments.month, metrics.impressions FROM customer WHERE metrics.impressions <> 0 ORDER BY segments.month DESC
月 | 表示回数 |
2025-02-01 | 2,421 |
2025-01-01 | 2,085 |
2024-12-01 | 2,101 |
・・・ |
そうすればこのようなデータを取得することができます。
ちなみに「customer」は、全体の「表示回数」から「クリック数」、「CV数」、「予算」などなど
総括したデータを取得したい場合に指定すると良いです。
Google広告スクリプトでは「GROUP BY」でまとめられない

ちょっと脱線しますが、Google広告スクリプトでは「GROUP BY」句は使えないようです。
月 | 表示回数 |
---|---|
2025-02-01 | 1,432 |
2025-02-01 | 989 |
2025-01-01 | 1,218 |
2025-01-01 | 867 |
2024-12-01 | 1,331 |
2024-12-01 | 770 |
・・・ |
これのデータをなんとか、同じ月は同じデータに統合させたいとします。
以下のように「GROUP BY」で指定してみましたが、Google広告スクリプト側でエラーが起きました。
SELECT segments.month, SUM(metrics.impressions) FROM campaign WHERE metrics.impressions <> 0 GROUP BY segments.month ORDER BY segments.month DESC

ま、考えてみれば当然ですよね。
隠れている(指定しなかった)列を表示させると下のようになるわけですから、いくら「GROUP BY」句を使おうが統合できようがありません。
(隠れているキャンペーン) | 月 | 表示回数 |
---|---|---|
キャンペーン東京 | 2025-02-01 | 1,432 |
キャンペーン大阪 | 2025-02-01 | 989 |
キャンペーン東京 | 2025-01-01 | 1,218 |
キャンペーン大阪 | 2025-01-01 | 867 |
キャンペーン東京 | 2024-12-01 | 1,331 |
キャンペーン大阪 | 2024-12-01 | 770 |
・・・ |
プログラムエラーが出る

プログラムエラーが出る原因は、テーブルに無い指標 を指定しているからだと考えられます。

テーブルに無い指標
ですか・・・?
キャンペーン | 月 | 表示回数 |
---|---|---|
キャンペーン東京 | 2025-02-01 | 1,432 |
キャンペーン大阪 | 2025-02-01 | 989 |
キャンペーン東京 | 2025-01-01 | 1,218 |
キャンペーン大阪 | 2025-01-01 | 867 |
キャンペーン東京 | 2024-12-01 | 1,331 |
キャンペーン大阪 | 2024-12-01 | 770 |
・・・ | ・・・ | ・・・ |

例えば、上のようなテーブルがあるとします。
このテーブルには「キャンペーン」、「月」、「表示回数」の指標があります。
しかし、「性別」を取得するよう指定した場合、当然このテーブルに無いのでエラーが返ってくる、ということです。
どのテーブルになんの指標が入っているのかはこちらから確認してみてください。

まとめ

・・・ごめんなさい。
簡単に説明するつもりが、結構しっかりと(Google広告スクリプトの)SQLを解説してしまいました。

・・・そうですね笑
今回は以下の内容で解説してもらいました。
○「FROM」句とは
– Google広告スクリプトで使用する、SQLの主な記載方法・構造
○データが分かれてしまう!?よくある「FROM」句のトラブル
– 思ったようなデータを取り出せない
– Google広告スクリプトでは「GROUP BY」でまとめられない
– プログラムエラーが出る

「FROM」句の説明のためにSQLの全体像を説明しました。
Google広告スクリプトでよく使うSQL文はこんな感じ。
SELECT segments.month, metrics.impressions FROM campaign WHERE metrics.impressions <> 0 ORDER BY segments.month DESC LIMIT 50
句の名前 | |
---|---|
FROM | “テーブル” を指定する機能があり、スプレッドシートで例えるなら、どの “シート” から参照するかの指示を記載する役割です。 |
SELECT | テーブル内のどの “列” を取得するか指定します。 |
WHERE | フィルターのような役割で、取得するデータを制限したり精査する機能があります。 |
ORDER BY | 取得したデータのソート・並び替えをすることができます。 |
LIMIT | 表示・出力するデータ数(行数)を絞ることができます。 |

SQL自体には、もっと多くの句や書き方がありますが、
今回は、Google広告スクリプトでよく使う内容として紹介しました。
コメント