技術ブログ

GASでスプレッドシートデータをBigQueryへ自動転送

/ 初心者向け

GASでスプレッドシートデータをBigQueryへ自動転送

はじめに:なぜスプレッドシートのデータをBigQueryへ?

スプレッドシートは手軽にデータを管理できる便利なツールですが、データ量が増えたり、複雑な分析を行いたい場合には限界があります。一方、BigQueryはGoogle Cloudが提供するスケーラブルで高速なデータウェアハウスであり、大量のデータ分析に最適です。

「でも、スプレッドシートからBigQueryへデータを移すのは大変そう…」

ご安心ください!Google Apps Script(GAS)を活用すれば、この面倒な作業を自動化できます。本記事では、GASを使ってスプレッドシートのデータをBigQueryに定期的に転送する方法を、初心者の方にも分かりやすく解説します。

事前準備:BigQueryとスプレッドシートの用意

まずは、BigQueryとスプレッドシートを準備しましょう。

1. BigQueryプロジェクトの作成とデータセット・テーブルの準備:

  • Google Cloud Platform (GCP) コンソールでプロジェクトを作成(または既存のものを使用)します。
  • BigQueryでデータセットを作成します。データセットは、テーブルを格納するコンテナのようなものです。
  • スプレッドシートのデータ構造に合わせたテーブルを作成します。列名とデータ型を定義してください。例えば、id (INTEGER), name (STRING), value (FLOAT) のような形式です。
  • 重要: テーブルのスキーマは、スプレッドシートの列構成と一致させる必要があります。

2. スプレッドシートの準備:

  • 転送したいデータを持つスプレッドシートを用意します。ヘッダー行があることが前提です。

Google Apps Script (GAS) での自動化

GASエディタを開き、以下のスクリプトを作成します。

function exportSheetToBigQuery() {
  // 設定値
  const sheetName = 'Sheet1'; // 転送したいシート名
  const projectId = 'your-gcp-project-id'; // あなたのGCPプロジェクトID
  const datasetId = 'your_dataset_id'; // BigQueryのデータセットID
  const tableId = 'your_table_id'; // BigQueryのテーブルID

  // スプレッドシートとシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(sheetName);

  // データ範囲を取得(ヘッダー行を除く)
  const dataRange = sheet.getDataRange();
  const values = dataRange.getValues();

  // ヘッダー行を取得し、データから除外
  const headers = values.shift();
  const data = values;

  // BigQueryへ挿入するデータ形式に変換
  // BigQueryのload()メソッドは、JSON形式の行配列を期待します。
  const rows = data.map(row => {
    const obj = {};
    headers.forEach((header, index) => {
      obj[header] = row[index];
    });
    return obj;
  });

  // BigQueryへデータをロード
  const options = {
    sourceFormat: 'NEWLINE_DELIMITED_JSON',
    writeDisposition: 'WRITE_APPEND' // 既存のデータに追記
    // writeDisposition: 'WRITE_TRUNCATE' // 既存のデータを上書き
  };

  // BigQuery API を使用してデータをロード
  const response = BigQuery.Jobs.insert({
    configuration: {
      load: {
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        },
        sourceUris: ['data:application/json,' + JSON.stringify(rows)], // インラインデータとして送信
        sourceFormat: options.sourceFormat,
        writeDisposition: options.writeDisposition
      }
    }
  });

  Logger.log('BigQuery job started: %s', response.jobReference.jobId);
  // 必要に応じてジョブの完了を監視する処理を追加することも可能ですが、
  // 簡単な転送であればこのまま実行します。
}

スクリプトの解説

  • 設定値: sheetName, projectId, datasetId, tableId をご自身の環境に合わせて変更してください。
  • データ取得: sheet.getDataRange().getValues() でスプレッドシートの全データを二次元配列として取得します。
  • ヘッダー処理: values.shift() でヘッダー行を取り除き、data には実際のデータのみを残します。
  • データ変換: map() メソッドと forEach() メソッドを組み合わせ、BigQueryが要求するJSON形式の行配列に変換します。各行は、ヘッダー名をキー、セル値を値とするオブジェクトになります。
  • BigQueryへのロード: BigQuery.Jobs.insert() メソッドを使用して、データをBigQueryにロードします。sourceUris には、JSON形式に変換したデータをインラインで渡しています。
  • writeDisposition: WRITE_APPEND は既存のデータに追記、WRITE_TRUNCATE は既存のテーブルを上書きします。必要に応じて選択してください。

BigQuery API の有効化

このスクリプトを実行するには、GASプロジェクトでBigQuery APIを有効にする必要があります。GASエディタの左側にある「+」アイコン(「サービスを追加」)をクリックし、「BigQuery API」を選択して追加してください。

トリガーの設定:自動実行

作成したGASスクリプトを定期的に実行するには、トリガーを設定します。

1. GASエディタの左側にある時計アイコン(「トリガー」)をクリックします。

2. 右下にある「トリガーを追加」ボタンをクリックします。

3. 以下の設定を行います。

  • 実行する関数を選択: exportSheetToBigQuery を選択します。
  • 実行するデプロイを選択: 「ヘッド」を選択します。
  • イベントのソースを選択: 「時間主導型」を選択します。
  • 時間間隔を選択: 「日次タイマー」、「週次タイマー」、「月次タイマー」など、ご希望の頻度を選択します。
  • 時刻の範囲を選択: 実行したい時間帯を選択します。

4. 「保存」をクリックします。

これで、指定した間隔で自動的にスプレッドシートのデータがBigQueryに転送されるようになります。

まとめ

Google Apps Script を使えば、スプレッドシートのデータを BigQuery へと簡単に自動転送できます。この自動化により、手作業によるミスを減らし、データ分析に集中できる時間を大幅に増やすことができます。

今回ご紹介した方法は、BigQueryへのデータ転送の第一歩です。さらに進んで、エラーハンドリングの強化や、データ前処理の追加など、より高度な処理もGASで実現可能です。ぜひ、ご自身の業務に合わせて活用してみてください。

このブログ記事が、皆さんのデータ活用の一助となれば幸いです。

GAS自動化の導入相談

請求書PDF作成、Gmail自動送信、Slack通知、スプレッドシート連携などを業務に合わせて実装できます。

請求書自動生成ツールを見る / SNS自動投稿ツールを見る