RedashのデータをGoogleスプレッドシートに自動で反映する方法


はじめに

Redashを使って取得したデータを時系列で比較したい時、今までは手作業で行っていました。
手作業だと取得し忘れたりなど地味に面倒なので、この作業を自動化できないかと考えたのがきっかけです。

手順

Googleスプレッドシートにベースとなるシートを作り、そのシートを定期的に複製することで、データをためていきます。

  1. RedashのデータをGoogleスプレッドシート用に調整
  2. GoogleスプレッドシートでRedashのデータを読み込む
  3. データの読み込み作業を自動化するスクリプトを設定
  4. 自動化した作業の繰り返しを設定

1. RedashのデータをGoogleスプレッドシート用に調整

Googleスプレッドシートに転記したいRedashデータを開き、Refresh Scheduleを設定します。
Refresh Scheduleは画面左下(下記画像の赤枠部分)の青文字から設定できます。

2. GoogleスプレッドシートでRedashのデータを読み込む

Googleスプレッドシートを開き、IMPORTDATAを使ってRedashのデータを読み込みます。
任意のセルに=IMPORTDATA("RefreshのQuery API Key")を入力すると、RedashのデータがGoogleスプレッドシートに反映されるようになります。

RefreshのQuery API Keyの取得方法

  1. 画面右上の・・・をクリック
  2. 展開したメニューのShow API Keyをクリック
  3. 表示されたモーダルのResults in CSV format下部のURLをコピーすれば完了

3. データの読み込み作業を自動化するスクリプトを設定

Googleスプレッドシートのツールバーにあるツールから、スクリプトエディタをクリックします。

Apps Scriptが表示されるので、画像の赤枠部分に以下のスクリプトを追加します。

function myFunction() {
  var book = SpreadsheetApp.openById('[GoogleスプレッドシートのID]');
  var sheet1 = book.getSheetByName('[シート1(コピー元のシート)]');
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd');
  var lastRow = sheet1.getLastRow();
  var lastColumn = sheet1.getLastColumn();

  book.insertSheet(date,1);
  var sheet2 = book.getSheetByName(date);
  var newData = sheet1.getRange( 1 , 1 , lastRow , lastColumn ).getValues();
  sheet2.getRange( 1 , 1 , lastRow , lastColumn ).setValues(newData);
}

このスクリプトでは、以下を実行するようにしています。
※ 画像では以下実行内容に加えて、書式設定もコピーするように記述していますが、ここでは割愛します

  1. 「シート1」の後ろに新しいシートを挿入する
  2. 「シート1」の情報を新しく追加したシートにコピーする
  3. 新しく追加したシートの名前を日付(yyyyMMdd)の名称に変更する

4. 自動化した作業の繰り返しを設定

  1. Apps Scriptの左にある時計アイコンをクリック(トリガーページへ移動)
  2. ページ右下のトリガーを追加をクリック(モーダルが起動)
  3. イベントのソースを選択時間主導型を選択
  4. 時間ベースのトリガーのタイプを選択で任意のタイマーを選択
  5. 最後にタイマーの実行間隔を選ぶ

私は毎日定時で取得して欲しかったので、以下のような設定にしました。

  • 時間ベースのトリガーのタイプを選択:日付ベースのタイマー
  • 時刻を選択:午前 10 時~11 時
    ※ Redashの実行タイミングと被らないように1時間遅めの実行時間でセット

以上です。
これでRedashのデータをGoogleスプレッドシートに自動的に持ってくることができるようになります。

最後までお読みいただき、ありがとうございました。


お世話になったサイト