RedashとGASを使って毎日自動で更新されるスプレッドシートを作る

以下のような環境に有効です

  • MySQLでデータを保存している

  • MySQLをRedashでデータ抽出・可視化している

やりたかったこと

  • Redashで叩いたクエリをGASで引っ張り、スプレッドシートに転記する

  • 毎日自動で更新

  • スプレッドシートの更新方法は、同じシートの最下部に一行足して最新の値を入力する

手順

  1. 転記先のスプレッドシートを用意

  2. スプレッドシートからGASを立ち上げる

  3. Redashの結果を、RedashからAPIを取得

  4. GASにスクリプトを入力・修正

  5. スクリプトを定期実行させるため、トリガーを追加

具体的なやり方

1~3は先人のブログを参考に

4 GASに入力するスクリプト

function updateDailyData() {
  // 1. Redash APIのエンドポイント
  var url = "あなたのRedash APIのエンドポイントを入れる";

  // 2. Redash API呼び出し
  var response = UrlFetchApp.fetch(url);
  var json = JSON.parse(response.getContentText());

  // 3. Redashのクエリ結果から配列を取得([{日付:..., DAU:...}, ...] のイメージ)
  var rows = json.query_result.data.rows;

  // 4. スプレッドシート参照(シート名は実際に合わせて書き換えて)
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名を入れる");
  if (!sheet) {
    throw new Error("指定のシートが見つかりません");
  }

  // 5. すでにシートに書いてある日付を全部取得しておく
  //    - 2行目以降のA列を読んで配列へ格納
  var lastRow = sheet.getLastRow();
  var existingDates = []; // "yyyy-MM-dd" の文字列を格納

  if (lastRow >= 2) {
    // A列だけ取得(2行目~最終行まで)
    var dateRange = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
    // dateRange は [[日付], [日付], ...] という二次元配列

    for (var r = 0; r < dateRange.length; r++) {
      var cellValue = dateRange[r][0]; // 1行分の配列(長さ1)から日付データだけ
      if (!cellValue) continue;

      // シートに保存されている日付が Date型ならフォーマットし、文字列ならそのまま new Date() でパース
      var formatted = Utilities.formatDate(new Date(cellValue), "Asia/Tokyo", "yyyy-MM-dd");
      existingDates.push(formatted);
    }
  }

  // 6. Redashの結果をループし、まだシートにない日付だけを書き込み
  for (var i = 0; i < rows.length; i++) {
    var rowData = rows[i];
    var rawDate = rowData.日付;  // Redashのクエリで「日付」というカラム名になっている想定
    var dauValue = rowData.DAU; // 同様に「DAU」というカラム名想定

    // A) Redashから来た日付を Dateオブジェクトに変換
    var dateObj = new Date(rawDate);
    // B) さらに "yyyy-MM-dd" 形式の文字列にフォーマット
    var dateStr = Utilities.formatDate(dateObj, "Asia/Tokyo", "yyyy-MM-dd");

    // すでにシートに同じ日付があればスキップ
    if (existingDates.indexOf(dateStr) !== -1) {
      continue;
    }

    // まだなければ追記
    sheet.appendRow([dateStr, dauValue]);
    // 追記した日付を existingDates に追加しておくことで、
    // ループ中の重複も防げる
    existingDates.push(dateStr);
  }
}

Chat GPTに基本書いてもらいながら、下記注意点が考慮されていなかったので修正して作成しました

注意点

Redashのクエリで、日付部分をDATE() で日付だけに変換する
Redashで取得する日付が時刻つきになっているケースがあるためです。


いいなと思ったら応援しよう!