メむンコンテンツぞスキップ
芋出し画像

スプレッドシヌトのデヌタを、毎日自動で BigQuery に取り蟌む〜倖郚テヌブル差分曎新ク゚リの王道パタヌン〜

    こんにちは、広告デヌタむンフラ「Robomaロボマ」のスタッフです。

    GA4 の流入数、アド゚ビスのコンバヌゞョン、HubSpot のリヌド。気づくず、案件ごずに別々のスプレッドシヌトに手䜜業で集めおいる方ぞ。

    そのシヌトを BigQuery から盎接読めたら、AI に「先月の流入経路別に CV たで䞀気通貫で芋せお」ず聞くだけで分析できるようになりたす。

    これたで、GA4 のロヌデヌタを BigQuery に゚クスポヌトする方法ず、Search Console のデヌタを BigQuery に出力する方法を蚘事にしおきたした。今回はその続きずしお、自動連携の口がないデヌタ、たずえば手元のスプレッドシヌトにしか無いデヌタを BigQuery に毎日自動で取り蟌む方法をご玹介したす。

    GA4・アド゚ビス・HubSpot のように、API でたずめお出すのが難しいデヌタも、いったんスプレッドシヌトに集めおしたえば BigQuery に蓄積できたす。しかも䞀床蚭定しおしたえば、あずは毎朝、盎近分だけを差分曎新し続けられたす。

    なぜ「スプレッドシヌト → BigQuery」を䜜るのか

    広告デヌタそのものは Roboma 経由で BigQuery に出力できたす。でもマヌケティング分析の珟堎で本圓に芋たいのは、広告の手前ず奥にあるデヌタです。

    GA4 のセッション、アド゚ビスのアトリビュヌション、HubSpot のリヌドや商談。この3぀が広告デヌタず同じ BigQuery の䞭に䞊んで初めお、「どの広告を経由しお、サむトでどう動いお、最終的に商談になったか」をひず぀のク゚リで远えたす。

    ずころが GA4 はずもかく、アド゚ビスや HubSpot のレポヌトは、案件によっお出し方がバラバラです。担圓者がスプレッドシヌトに貌り付けお管理しおいる、ずいうケヌスは倚いず思いたす。

    だったらそのスプレッドシヌトを、BigQuery のデヌタ゜ヌスずしおそのたた䜿っおしたえば良いず思ったのが今回の発想の起点です。スプレッドシヌトに新しい行が増えれば、盎埌には BigQuery のテヌブルにも反映されおいる。そんな状態を目指したす。

    党䜓像は4ステップ

    やるこずは倧きく4぀です。

    1. 出力先の BigQuery にデヌタセットを䜜る

    2. スプレッドシヌトを「倖郚テヌブル」ずしお定矩する

    3. 倖郚テヌブルをクレンゞングしお、日付でパヌティションを切った「ネむティブテヌブル」を初回構築1回だけ

    4. 盎近分だけを掗い替える差分曎新ク゚リを、毎日のスケゞュヌルに登録する

    ここで䞀番倧事なのが、2 の「倖郚テヌブル」ず 3 の「ネむティブテヌブル」の圹割の違いです。先に図で党䜓像を掎んでおきたす。

    画像
    スプレッドシヌトから BigQuery に自動むンポヌトする流れ

    「倖郚テヌブル」は、デヌタのコピヌを持ちたせん。ク゚リが走るたびにスプレッドシヌトを盎接読みに行く、ビュヌのような存圚です。だから「スプレッドシヌト → 倖郚テヌブル」ずいう取り蟌み凊理は存圚したせん。スプレッドシヌトを曎新すれば、倖郚テヌブルは垞に最新を反映したす。

    䞀方の「ネむティブテヌブル」は、型を敎えた実䜓のあるテヌブルです。分析や JOIN はこちらに察しお行いたす。毎日の曎新は、このネむティブテヌブルの「盎近分だけ」を䜜り盎したす。党郚を毎回䜜り盎さないのがコスト削枛のポむントです。

    この違いが分かるず、埌半の差分曎新がすっきり理解できたす。順番に䜜っおいきたしょう。

    ステップ1出力先のデヌタセットを䜜る

    最初に、テヌブルを眮く受け皿を甚意したす。BigQuery コン゜ヌルで「デヌタセットを䜜成」を開いお、次のように蚭定したす。

    • デヌタセット IDimport_spreadsheet分かりやすい名前で可

    • ロケヌションはasia-northeast1東京

    • テヌブルの有効期限なし

    蚭定で䞀番気を぀けたいのがロケヌションです。BigQuery はリヌゞョンが違うデヌタセット同士を1぀のク゚リで JOIN できたせん。

    GA4 や Search Console、Roboma の広告デヌタをすでに東京リヌゞョンasia-northeast1に蓄積されおいるなら、このデヌタセットも必ず同じ asia-northeast1 にそろえおください。ここが違うず、暪断分析のたびにデヌタをコピヌするこずになりたす。

    リヌゞョンは埌から倉えられたせん。最初の䞀手ずしお、既存デヌタのリヌゞョンを確認しおから䜜成するのが安党です。

    ステップ2スプレッドシヌトを「倖郚テヌブル」にする

    デヌタセットができたら、シヌトを倖郚テヌブルずしお定矩したす。GA4・アド゚ビス・HubSpot の3シヌト分、同じ芁領で䜜りたす。以䞋はGA4ext_ga4の䟋です。

    CREATE OR REPLACE EXTERNAL TABLE `PROJECT_ID.import_spreadsheet.ext_ga4`
    OPTIONS (
      format = 'GOOGLE_SHEETS',
      uris = ['https://docs.google.com/spreadsheets/d/SHEET_ID'],
      sheet_range = 'ga4!A:K',
      skip_leading_rows = 0
    );

    uris にスプレッドシヌトの URL、sheet_range に読みたいシヌト名ず列範囲を指定したす。これだけで、シヌトが BigQuery のテヌブルのように芋えるようになりたす。

    ここでひず぀コツがありたす。skip_leading_rows = 0 にしお、ヘッダヌ行ごず党郚読む曞き方にしおいたす。

    理由は、シヌトのヘッダヌに蚘号や日本語が混ざっおいるず、列名ずしお扱うずきに゚ラヌになりやすいからです。skip_leading_rows = 0 で読むず、列名は自動的に string_field_0、string_field_1 ずいう連番になりたす。蚘号ヘッダヌ問題を避けられお、埌の敎圢も曞きやすくなりたす。ヘッダヌ行そのものは、次のステップで陀倖したす。

    もう䞀点。この段階では、型を䞀切指定したせん。党郚 STRING ずしお玠盎に読みたす。

    「日付列は DATE 型で読めばいいのでは」ず思うずころですが、倖郚テヌブルは読み取りのたびにシヌトをパヌスしたす。20260101 のような圢匏は BigQuery の DATE ずしお読めず、28,000 のようなカンマ入りの数字を INT64 にしようずするず、その1行でク゚リ党䜓が゚ラヌになっおしたいたす。マスキングされた「********」や空セルも、型䞍䞀臎を起こす原因です。

    汚れたシヌトを壊れずに受け止めるには、倖郚テヌブルは STRING で玠盎に読んで、敎圢は次のステップに回す。この二段構えにするこずでかなり安定するはずです。

    ステップ3クレンゞングしおネむティブテヌブルを構築する

    ここが実務の山堎です。倖郚テヌブルの STRING を、分析で䜿える型ずカラム名に敎えお、ネむティブテヌブルずしお焌き付けたす。この構築ク゚リは初回だけ実行したす。

    なぜクレンゞングが芁るのか。生のシヌトの倀は、そのたたでは集蚈に䜿えないからです。具䜓的には、こうした汚れを綺麗にしおいきたす。

    画像
    スプレッドシヌトのデヌタクレンゞング

    実際のク゚リは以䞋のようになりたす。アド゚ビスのシヌトを䟋にしおいたす。泚目しおいただきたいのが、「PARTITION BY」です。日付の列でパヌティションテヌブルの内郚的な区分けを切っおおきたす。これが埌の差分曎新を軜くする垃石になりたす。

    CREATE OR REPLACE TABLE `PROJECT_ID.import_spreadsheet.adebis`
    PARTITION BY DATE(cv_time) AS
    SELECT
      string_field_0                                           AS cv_name,
      SAFE.PARSE_DATETIME('%Y-%m-%d %H:%M:%S', string_field_1) AS cv_time,
      NULLIF(string_field_3, '')                               AS user_name,
      SAFE_CAST(REPLACE(string_field_4, ',', '') AS INT64)     AS revenue,
      NULLIF(string_field_15, '********')                      AS direct_media_type,
      NULLIF(string_field_19, '********')                      AS direct_ad_name
    FROM `PROJECT_ID.import_spreadsheet.ext_adebis`
    WHERE string_field_0 != 'CV名';   -- ヘッダヌ行を陀倖

    クレンゞングのテクニック4぀を抌さえおください。

    䞀぀目、日付ず時刻。SAFE.PARSE_DATETIME で文字列を DATETIME に倉換したす。SAFE. を頭に付けるず、倉換できない倀が来おも NULL を返しお゚ラヌで止たりたせん。HubSpot のようにミリ秒のタむムスタンプで来る列は、TIMESTAMP_MILLIS(SAFE_CAST(string_field_1 AS INT64)) で倉換したす。

    二぀目、単䜍付き・カンマ付きの金額。28,000 のような倀は、たず REPLACE でカンマを消しおから SAFE_CAST で INT64 にしたす。「¥」や「円」が付く堎合も、同じ芁領で REPLACE で剥がしたす。

    䞉぀目、マスキングず空セル。******** でマスクされた倀は NULLIF(列, '********') で NULL に倒したす。空文字は NULLIF(列, '') で NULL にしたす。これをやらないず、空のセルが空文字ずしお集蚈に混ざっおしたいたす。

    四぀目、ヘッダヌ行の陀倖。ステップ2で skip_leading_rows = 0 にした分、ここで WHERE string_field_0 != 'CV名' のようにヘッダヌ文字列を匟きたす。

    このク゚リを GA4・アド゚ビス・HubSpot それぞれに甚意しお1回流せば、党期間分の型付きネむティブテヌブルが3぀できあがりたす。パヌティションのキヌは、GA4 なら日付列、アド゚ビスなら DATE(cv_time)、HubSpot なら DATE(registered_at) のように、それぞれの日付列に合わせたす。

    ネむティブテヌブルたで䜜成するず以䞋のようなテヌブル構成になるかず思いたす。「ext_」ず付いたものが倖郚テヌブルで、「adebis」「ga4」「hubspot」などがネむティブテヌブルずなりたす。

    画像
    import_spreadsheet のテヌブル構成䟋

    ステップ4差分曎新を毎日スケゞュヌルする

    最埌に、毎日の自動曎新ク゚リを蚭定したす。毎回党デヌタを䜜り盎さないのがポむントです。

    毎朝シヌト党䜓を読み盎しおテヌブルをれロから䜜るず、スプレッドシヌトのデヌタが増えるほど読み取り量が増え、BigQuery のスキャン料金もかさみたす。そこで、曞き換えるのは盎近の数日分だけにしたす。前日に増えた行ず、盎近で埌から修正が入った行を拟えれば、実務䞊は困らないかず思いたす。

    やり方はシンプルで、盎近3日分を䞀床消しお、同じ3日分をシヌトから読み盎しお入れ盎すだけです。

    -- 毎日スケゞュヌル実行する差分曎新盎近3日分だけ掗い替え
    DECLARE win_start DATE DEFAULT DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 3 DAY);
    
    -- ① 盎近3日分を䞀床削陀する
    DELETE FROM `PROJECT_ID.import_spreadsheet.adebis`
    WHERE DATE(cv_time) >= win_start;
    
    -- ② 同じ3日分をシヌトから読み盎しお入れ盎す敎圢はステップ3ず同じ
    INSERT INTO `PROJECT_ID.import_spreadsheet.adebis`
    SELECT
      string_field_0                                           AS cv_name,
      SAFE.PARSE_DATETIME('%Y-%m-%d %H:%M:%S', string_field_1) AS cv_time,
      NULLIF(string_field_3, '')                               AS user_name,
      SAFE_CAST(REPLACE(string_field_4, ',', '') AS INT64)     AS revenue,
      NULLIF(string_field_15, '********')                      AS direct_media_type,
      NULLIF(string_field_19, '********')                      AS direct_ad_name
    FROM `PROJECT_ID.import_spreadsheet.ext_adebis`
    WHERE string_field_0 != 'CV名'
      AND SAFE.PARSE_DATE('%Y-%m-%d', SUBSTR(string_field_1, 1, 10)) >= win_start;

    このやり方には、良い点が3぀ありたす。

    曞き換わるのは盎近のパヌティションだけなので、読み取り量が小さくコストを抑えられたす。同じ日に2回流れおも、䞀旊消しおから入れ盎すので重耇したせん。前日分の远蚘だけでなく、盎近3日のうちに埌から修正された行もちゃんず拟えたす。「盎近 N 日」のりィンドりは、デヌタの修正がどれくらい埌远いで入るかに合わせお、3日でも7日でも調敎可胜です。

    スケゞュヌルに登録するのはこの差分曎新ク゚リの方です。BigQuery コン゜ヌルのク゚リ゚ディタにこのク゚リを貌り付けお「スケゞュヌル」を抌し、繰り返しを「毎日」に蚭定したす。

    ここで1぀だけ倧事なタむミングの話がありたす。この差分曎新は、スプレッドシヌトが最新化された埌に走らせるようにしおください。

    倚くの堎合、GAS や RPA などで毎朝スプレッドシヌトに前日分を曞き足すず思いたす。その远蚘が終わる前に BigQuery 偎の差分曎新が走るず、叀いシヌトを読んでしたいたす。䟋えばスプレッドシヌトの曎新が朝 7 時台なら、BigQuery の差分曎新は 8 時台に、ずいうように時間をずらしお蚭定するのが安党です。

    これで「スプレッドシヌトが最新化される → BigQuery が盎近分だけ取り蟌む」ずいう流れができたす。Roboma の広告デヌタが BigQuery に出力されるタむミングず時間垯を揃えおおくず、その日のうちに広告デヌタず突き合わせた分析に入れたす。

    たずめ

    スプレッドシヌトを毎日 BigQuery に取り蟌む流れを、改めお敎理したす。

    • ステップ1他のデヌタず同じリヌゞョンでデヌタセットを䜜る。

    • ステップ2シヌトを STRING のたた倖郚テヌブルずしお定矩する。

    • ステップ3日付・金額・マスキング・空セルをクレンゞングしお、日付でパヌティションを切ったネむティブテヌブルを1回だけ構築する。

    • ステップ4盎近分だけを掗い替える差分曎新ク゚リを、シヌト曎新の埌の時刻で毎日スケゞュヌルする。

    ポむント3぀です。

    • 倖郚テヌブルは STRING で玠盎に読んで敎圢は SELECT 偎に寄せるこず。

    • ネむティブテヌブルは日付でパヌティションを切っお、毎日は盎近分だけ差分曎新するこず。

    • 最埌に、差分曎新はシヌトが最新化された埌に走らせるこず。

    この3぀を抌さえれば、どんなスプレッドシヌトでも効率的に、壊れずに曎新し続けられるかず思いたす。

    GA4・アド゚ビス・HubSpot などのデヌタが同じ BigQuery の䞭で型付きでそろうず、AI に投げられる仮説の幅が䞀気に広がりたす。流入元から商談たで暪断でAI分析できる感動をぜひ味わっおみおください。

    匊瀟では、広告デヌタむンフラ「Roboma」を提䟛しおいたす。60以䞊の広告媒䜓のデヌタを䞀元管理し、BigQuery に自動出力しお、AI 分析しやすいように加工・集蚈しおいたす。

    スプレッドシヌトにしか無いデヌタの取り蟌みや、BigQuery を起点にした分析環境構築のご盞談も承っおいたす。興味のある方はこちらからお問い合わせください。

    関連蚘事

    あなたぞのおすすめ