BigQueryのデータを定期的にGooleスプレッドシートに出力する方法

こんにちは、ピリカ開発の冨田です。

今日は、BigQueryのデータを定期的にGooleスプレッドシートに出力する方法について書きたいと思います。

今回使用するツールはOWOX BI BIgQuery Reportsという無料のアドオンツールです。

というのも、GoogleのConnectedSheetを使用すれば、同様のことは可能なのですが、使用できる条件が、合わなかったので他の方法を探しました。

概要

OWOX BI BIgQuery Reportsというツールを使って、BigQueryからGoogleスプレッドシートに出力する方法をご紹介します。

使用するツール

OWOXのOWOX BI BIgQuery Reportsというサービスです。

BigQueryを直接スプレッドシートに出力できるものです。

OWOXはOWOX BIというデータ可視化ツールを提供されています。

OWOXが別途無料で公開しているツールがOWOX BI BIgQuery Reportsのようです。

BigQueryのクエリの課金以外は、無料で利用することができます。

使用できる条件

  • GoogleWorkPlaceを利用できること

設定の流れ

  1. OWOX BI BIgQuery Reportsをインストールする

  2. OWOX BI BIgQuery Reportsを使ってスプレッドシートからBigQueryのクエリを実行できるようにする

  3. 定期的に2を実行するように設定する

1. OWOX BI BIgQuery Reportsをインストールする

Googleのマーケットプレイスからインストールできます。

2. OWOX BI BIgQuery Reportsを使ってスプレッドシートからBigQueryのクエリを実行できるようにする

2-1. 出力先のスプレッドシートを開く。

2-2. 「アドオン」タブ → 「OWOX BI BIgQuery Reports」 → 「Add a new Report」を押す。

'アドオンかタブから選択できる'
OWOX BI BIgQuery Reportsのアドオン

これで右側に「Add & Run a new report」というウィンドウが立ち上がります。

2-3. BigQueryの設定をする。

「Select Google BigQuery project」は、GoogleCloudPlatformのプロジェクト名を、

「Select a query」で、「+ Add new query」を選択します。

2-4. クエリを書いて保存する。

「Add a new query」というウィンドウが開くので、ここに実行したいクエリを書き、「Save&Run」もしくは「Save」するだけです。

クエリを作成後Save&RunもしくはRunをクリック
クエリ入力画面

これらの、クエリの設定は、スプレッドシートの1シートごとに設定できます。

3. 定期的に2を実行するように設定する

定期実行の設定は、同じく「アドオン」タブから行えます。

3-1. 「アドオン」タブ → 「OWOX BI BIgQuery Reports」 → 「Schedule Reports」を押す。

成功時や失敗時にメールで通知を受け取ることもできます。

おまけ. 他のスプレッドシートにコピーする

このスプレッドシートを他の人と共有したかったのですが、 クエリが叩けてしまうスプレッドシートを共有するのは抵抗がありました。

そこでスプレッドシートにGASを書いて、別スプレッドシートに丸々コピー、それを共有することにしました。

const TO_SPREAD_SHEET_KEY = '<TO SPREAD SHEET KEY>';
const TO_SPREAD_SHEET_NAME = '<TO SPREAD SHEET NAME>';
const FROM_PREAD_SHEET_NAME = '<FROM SPREAD SHEET NAME>';

function copyToSpreadSheet() {
  const toSpreadSheet = SpreadsheetApp.openById(TO_SPREAD_SHEET_KEY).getSheetByName(TO_SPREAD_SHEET_NAME);
  const currentSpreadSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(FROM_PREAD_SHEET_NAME);

  let column = currentSpreadSheet.getLastColumn();
  let raw = currentSpreadSheet.getLastRow();

  let values = currentSpreadSheet.getRange(1, 1, raw, column).getValues();

  toSpreadSheet.getRange(1, 1, raw, column).setValues(values);
}

ここまで読んでくださってありがとうございました!