RedashとGASを使って毎日自動で更新されるスプレッドシートを作る
以下のような環境に有効です
MySQLでデータを保存している
MySQLをRedashでデータ抽出・可視化している
やりたかったこと
Redashで叩いたクエリをGASで引っ張り、スプレッドシートに転記する
毎日自動で更新
スプレッドシートの更新方法は、同じシートの最下部に一行足して最新の値を入力する
手順
転記先のスプレッドシートを用意
スプレッドシートからGASを立ち上げる
Redashの結果を、RedashからAPIを取得
GASにスクリプトを入力・修正
スクリプトを定期実行させるため、トリガーを追加
具体的なやり方
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で取得する日付が時刻つきになっているケースがあるためです。