GA4インポート/アプリ計測で過去データをインポートする方法
GA4データ連携やアプリ計測で連携しているデータセットの、インポート開始日より過去のデータテーブルをインポートしたい場合があります。これを実現するために、指定された日付範囲のテーブルをソースデータセットからターゲットデータセットに複製(クローン)する必要があります。
本ガイドラインでは、そのために必要なスクリプトの準備および実行方法の詳細を説明します。

テーブルをクローンするスクリプト
-- =============================================================
-- PREPARATION: CLIENT SPECIFIC CONFIGURATION
-- =============================================================
set @@location = ""; -- << Change to the dataset region
DECLARE source_dataset STRING DEFAULT '' ;
DECLARE target_dataset STRING DEFAULT '';
DECLARE start_date DATE DEFAULT DATE '';
DECLARE end_date DATE DEFAULT DATE '';
-- =======================================================
-- INTERNAL LOGIC - PLEASE DONOT MODIFY BELOW THIS LINE.
-- =======================================================
DECLARE processing_date DATE;
DECLARE table_name STRING;
DECLARE source_table_exists BOOL;
DECLARE target_table_exists BOOL;
DECLARE clone_sql_query STRING;
DECLARE create_schema_stmt STRING;
DECLARE clone_table_stmt STRING;
DECLARE check_source_table_stmt STRING;
DECLARE check_target_table_stmt STRING;
ASSERT source_dataset IS NOT NULL AND TRIM(source_dataset) <> ''
AND target_dataset IS NOT NULL AND TRIM(target_dataset) <> ''
AND start_date IS NOT NULL
AND end_date IS NOT NULL
AS "Missing values!!! Please set the value for all required fields: source_dataset, start_date, end_date, target_dataset";
ASSERT start_date <= end_date
AS 'ERROR: start_date must be <= end_date';
-- Query Statements
SET create_schema_stmt = FORMAT(
'CREATE SCHEMA IF NOT EXISTS `%s`', target_dataset
);
SET check_source_table_stmt = FORMAT("""
SELECT EXISTS (
SELECT 1
FROM `%s.%s`.INFORMATION_SCHEMA.TABLES
WHERE table_name = @tbl
)""", @@project_id, source_dataset
);
SET check_target_table_stmt = FORMAT("""
SELECT EXISTS (
SELECT 1
FROM `%s.%s`.INFORMATION_SCHEMA.TABLES
WHERE table_name = @tbl
)""", @@project_id, target_dataset
);
SET clone_table_stmt = """
CREATE TABLE `%s.%s.%s`
CLONE `%s.%s.%s`
""";
-- Create new dataset for cloned tables.
EXECUTE IMMEDIATE create_schema_stmt;
SET processing_date = start_date;
WHILE processing_date <= end_date DO
SET table_name = FORMAT('events_%s', FORMAT_DATE('%Y%m%d', processing_date));
-- Check if table exists in the source dataset.
EXECUTE IMMEDIATE check_source_table_stmt
INTO source_table_exists
USING table_name AS tbl;
-- Check if table already cloned in the target dataset.
IF source_table_exists THEN
EXECUTE IMMEDIATE check_target_table_stmt
INTO target_table_exists
USING table_name AS tbl;
ELSE
SET target_table_exists = FALSE;
END IF;
IF source_table_exists AND NOT target_table_exists THEN
SET clone_sql_query = FORMAT(
clone_table_stmt,
@@project_id, target_dataset, table_name,
@@project_id, source_dataset, table_name
);
BEGIN
EXECUTE IMMEDIATE clone_sql_query;
EXCEPTION WHEN ERROR THEN
SELECT FORMAT("Clone failed for: %s.%s", source_dataset, table_name) AS failed_status;
END;
END IF;
SET processing_date = DATE_ADD(processing_date, INTERVAL 1 DAY);
END WHILE;
上記スクリプトは、オペレーター(本運用担当者)の入力設定に基づいて、以下の操作を実行します。
-
スクリプトを実行するプロジェクト上に新しいデータセットを作成します。
指定された日付範囲内の各日付について、
- ソースデータセットにテーブルが存在するかどうかを確認します。
- ターゲットデータセットにテーブルが既にクローンされていないかどうかを確認します。
- 上記の2つの条件が満たされた場合、ソースデータセットからターゲットデータセットにテーブルクローンします。
前提条件
- 同一ロケーションルール: ソースデータセット、ターゲットデータセット、およびジョブ処理は同一のロケーションでなければなりません。最初のステートメントの
SET @@locationにジョブのロケーションを指定します。 - 同一プロジェクト: ターゲットデータセットとすべてのクローンテーブルは、source_dataset と同じプロジェクト配下に作成されます。
- 冪等性: スクリプトは、ターゲットデータセットに既に存在するテーブルをスキップします。
- コスト: クローンDDL自体はデータをスキャンしません。
INFORMATION_SCHEMAによるメタデータチェックでは、クエリごとに約10MBの最小課金対象スキャンが発生します。
事前準備
役割と権限
このスクリプトは、ターゲットデータセットが存在しない場合は作成(CREATE SCHEMA IF NOT EXISTS )します。そのため、ユーザはデータセットを作成するためのプロジェクトレベルの権限が必要です。
BigQuery を実行するユーザには、次のロールが付与されている必要があります。
| ロール | 付与レベル | 権限 |
|---|---|---|
| BigQuery ジョブユーザー | プロジェクト | BigQuery クエリジョブを実行する |
| BigQuery ユーザー | プロジェクト | ターゲットデータセットを新規作成 |
| BigQuery データ閲覧者 | データセット(ソース) | 既存のテーブルの読み取り |
権限付与方法
プロジェクトレベルのロール
Google Cloud コンソールを使ってプロジェクトレベルのロールを付与します。
- IAM と管理 → IAM を選択し、アクセスを許可を選択
- プリンシパル: オペレーターのユーザアカウント
- ロール:
- BigQuery ジョブユーザー を追加
- BigQuery ユーザー を追加
- 保存 をクリック
データセットレベルのロール
Google Cloud コンソールを使ってデータセットレベルのロールを付与します。
- BigQuery 配下でソースデータセットを選択し、共有 → 権限を管理 を選択
- プリンシパルを追加 をクリック
- プリンシパル: オペレーターのユーザアカウント
- ロール: BigQuery データ閲覧者 を追加
- 保存 をクリック
- ターゲットデータセットが自動作成された時点で、オペレーターに BigQuery データオーナー 権限が付与されます。
- ソース データセットについては、権限変更はありません。
スクリプトの設定
スクリプト先頭の PREPARATION: CLIENT SPECIFIC CONFIGURATION セクションを編集してください。
@@location- ジョブの処理ロケーション(ソース・ターゲットの両データセットで同一)
- 東京リージョンの場合:
asia-northeast-1 - 米国リージョンの場合:
us
source_dataset- 日次テーブルがすでに格納されていて、クローン元となるデータセットです。
target_dataset- ソースデータセットからクローンしたテーブルを格納する新しいデータセットです。
- 名前付けのヒント:
<source_dataset>_clone
start_date/end_date- 過去データを含むテーブルの取得対象となる日付範囲です。
yyyy-mm-dd形式で指定します(例:2025-11-06)。start_date- 取り込みを開始する最初の日付end_date- 取り込み対象の最後の日付
指定例 ※そのままコピーしないでください。お客様側で適切に設定してください
set @@location = "asia-northeast-1"; DECLARE source_dataset STRING DEFAULT 'analytics_xxxx'; DECLARE target_dataset STRING DEFAULT 'analytics_xxxx_clone'; DECLARE start_date DATE DEFAULT '202x-0x-0x'; DECLARE end_date DATE DEFAULT '202x-0x-1x';
スクリプトの実行
BigQuery コンソールを使ってください。
- BigQuery の SQL ワークスペースを開きます。
- エディタにスクリプト(提供されたもの)を貼り付けます。
- 上記で説明した通り、設定セクションを編集します。
- 「実行」をクリックします。操作完了は結果パネルで確認してください。
USERGRAMへインポートする
テーブルのクローンが作成されたら、USERGRAMの設定UIを使ってプロジェクト名と新しいデータセット名 (クローンされたテーブルが含まれる target_dataset) を USERGRAM に登録します。
テーブル複製時のトラブルシューティング
無効なロケーション
ロケーションが設定されていない、または誤って設定されている場合、スクリプト実行前に UI コンソールで上記のエラーが表示されます。
データセット情報で確認できるデータセットのロケーションを設定してください。
設定入力が提供されていない
スクリプトを実行する前に、スクリプトの設定 に記載されている通り、すべての入力項目を必ず提供してください。
アクセス拒否
役割と権限 に記載されているロールを確認してください。
現在の実行リージョンとロケーションが一致しない
これは、クエリ処理ロケーションがクエリ冒頭の @@location で指定したロケーションと異なる場合に発生します。
解決するには、以下の手順で処理ロケーションを自動に変更してください:
その他 → クエリの設定 を選択、ロケーション配下の 自動ロケーション選択 をチェック