技術ブログ

GASでスプレッドシートからBigQueryへ自動転送

/ 初心者向け

GASでスプレッドシートからBigQueryへ自動転送

Google Apps ScriptでスプレッドシートのデータをBigQueryに自動転送!

皆さん、こんにちは!Google Apps Script(GAS)専門ブロガーの[あなたの名前]です。

今回は、多くの方が日々利用しているであろう「Google スプレッドシート」のデータを、より強力な分析基盤である「Google BigQuery」へ自動で転送する方法について、初心者の方にも分かりやすく解説していきます。

なぜスプレッドシートからBigQueryへ?

スプレッドシートは手軽にデータを管理・共有できる非常に便利なツールですが、データ量が増えたり、複雑な分析を行いたい場面では、その限界を感じることもあります。一方、BigQueryは、大量のデータを高速に処理・分析できるデータウェアハウスです。

「スプレッドシートのデータをもっと効率的に分析したい」「定期的にスプレッドシートのデータを集計してBigQueryに蓄積したい」といったニーズに応えるために、GASを使った自動転送が非常に有効になります。

自動転送の全体像

今回実現するのは、以下の流れです。

1. トリガー設定: 特定の時間(例: 毎日午前3時)や、スプレッドシートの更新をトリガーにしてGASを実行します。

2. スプレッドシートからデータ取得: GASがスプレッドシートを開き、必要なシート・範囲のデータを読み込みます。

3. BigQueryへデータ挿入: 取得したデータをBigQueryの指定したテーブルに挿入します。

事前準備

始める前に、以下の準備が必要です。

  • Google アカウント: GAS、スプレッドシート、BigQueryを利用するために必要です。
  • Google スプレッドシート: 転送したいデータが含まれるスプレッドシート。
  • Google BigQuery: データを格納するデータセットとテーブルを作成しておきます。
  • データセットの作成: BigQueryのコンソールで、任意のデータセット名で作成します。
  • テーブルの作成: データセット内に、スプレッドシートの列構成に合わせたスキーマでテーブルを作成します。
  • 注意点: テーブルのスキーマは、GASから挿入するデータの型と一致させる必要があります。例えば、スプレッドシートの「日付」列はBigQueryではDATE型やTIMESTAMP型にするなど、適切な型を選びましょう。
  • GASプロジェクトの作成: スプレッドシートを開き、「拡張機能」>「Apps Script」から新しいスクリプトエディタを開きます。

GASスクリプトの作成

では、実際にGASのコードを書いていきましょう。

1. スプレッドシートのデータを取得する関数

function getSpreadsheetData() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート名'); // データを取得したいシート名に変更
  const range = sheet.getDataRange();
  const values = range.getValues();

  // ヘッダー行を削除する場合(BigQueryにヘッダーは不要なため)
  values.shift();

  return values;
}

この関数では、アクティブなスプレッドシートから指定したシートの全データを取得しています。values.shift();でヘッダー行を削除していますが、必要に応じて削除しない、または別の処理を行うように変更してください。

2. BigQueryへデータを挿入する関数

BigQueryへデータを挿入するには、BigQueryというサービスを使いますが、GASの標準機能には含まれていないため、BigQueryという名前のサービスを明示的に追加する必要があります。

1. GASエディタの左側メニューにある「+」アイコン(サービス)をクリックします。

2. 「BigQuery」を検索して選択し、「追加」をクリックします。

function insertDataToBigQuery() {
  const projectId = 'YOUR_PROJECT_ID'; // ご自身のGCPプロジェクトIDに変更
  const datasetId = 'YOUR_DATASET_ID'; // 作成したデータセットIDに変更
  const tableId = 'YOUR_TABLE_ID'; // 作成したテーブルIDに変更

  const data = getSpreadsheetData();

  if (data.length === 0) {
    Logger.log('転送するデータがありません。');
    return;
  }

  try {
    // BigQueryにデータを挿入
    const result = BigQuery.Jobs.insert({
      configuration: {
        load: {
          destinationTable: {
            projectId: projectId,
            datasetId: datasetId,
            tableId: tableId
          },
          sourceData: {
            data:
              data.map(row => (
                { "values": row.map(val => String(val)) } // 全て文字列に変換して挿入
              ))
          },
          writeDisposition: 'WRITE_APPEND', // 追記モード('WRITE_TRUNCATE'で上書き)
          skipLeadingRows: 0
        }
      }
    });
    Logger.log('BigQueryへのデータ挿入が完了しました。Job ID: %s', result.id);
  } catch (e) {
    Logger.log('BigQueryへのデータ挿入中にエラーが発生しました: %s', e.toString());
  }
}

コードの解説:

  • projectId, datasetId, tableId: ご自身の環境に合わせて適切に設定してください。
  • data.map(row => ({ "values": row.map(val => String(val)) })): BigQueryへの挿入形式に合わせるために、各行の各値を文字列に変換しています。BigQueryのスキーマに合わせて、必要であればここで型変換を行ってください。
  • writeDisposition: 'WRITE_APPEND': 既存のデータに追記します。 'WRITE_TRUNCATE' を指定すると、テーブルの内容がすべて削除され、新しいデータで上書きされます。

3. 全体をまとめる関数

function transferSpreadsheetToBigQuery() {
  Logger.log('スプレッドシートからBigQueryへのデータ転送を開始します。');
  insertDataToBigQuery();
  Logger.log('スプレッドシートからBigQueryへのデータ転送が完了しました。');
}

トリガーの設定

このスクリプトを自動で実行するために、トリガーを設定します。GASエディタの左側メニューにある時計アイコン(トリガー)をクリックします。

1. 「トリガーを追加」ボタンをクリックします。

2. 実行する関数を選択: transferSpreadsheetToBigQuery を選択します。

3. 実行するデプロイを選択: Head を選択します。

4. イベントソースを選択: 「時間主導型」を選択します。

5. 時間間隔を選択: 「毎日」「午前3時~4時」など、任意のスケジュールを設定します。

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

初めてトリガーを作成する際には、Googleアカウントへの承認を求められますので、内容を確認して許可してください。

まとめ

いかがでしたでしょうか?

Google Apps Scriptを使えば、スプレッドシートのデータをBigQueryに自動で転送し、より高度なデータ分析への第一歩を踏み出すことができます。

今回の記事を参考に、ぜひご自身の業務やプロジェクトでGASを活用してみてください。もし不明な点があれば、コメント欄で気軽にご質問ください!

次回の記事もお楽しみに!

GAS自動化の導入相談

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

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