RDB のデータを手間をかけずに無料でグラフ表示できて、アクセス制限できるものを作ります。
まず新しい Google スプレッドシートを作り、data1
というシートを作ります。
次に「ツール>スクリプトエディタ」を開きます。次のコードを コード.gs
にペーストして、DBへアクセスするアカウントとクエリを書き換えます。
var address = 'ほすと:3306';
var user = 'ゆーざ';
var userPwd = 'ぱすわーど';
var db = 'でーたべーす';
var dbUrl = 'jdbc:mysql://' + address + '/' + db + '?characterEncoding=utf8&requireSSL=true'; // ← MySQL 以外の DB でもきっとつなげると思う
function updateData1() {
var query = 'SELECT 1;'; // ← ここに好きなクエリを書く
replaceSheet(query, 'data1'); // ← 結果が書き込まれるシート
}
function replaceSheet(query, sheetName) {
Logger.log(query);
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.createStatement();
var results = stmt.executeQuery(query);
var metadata = results.getMetaData();
var numCols = metadata.getColumnCount();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
sheet.clear();
var row = [];
for (var col = 0; col < numCols; col++) {
row = row.concat([metadata.getColumnLabel(col+1)]);
}
sheet.appendRow(row);
while (results.next()) {
row = [];
for (var col = 0; col < numCols; col++) {
row = row.concat([results.getString(col + 1)]);
}
sheet.appendRow(row);
}
results.close();
stmt.close();
}
できたら保存して、updateData1()
を実行してみます。スプレッドシートにクエリ結果が書き込まれたら成功です。
上のコードでは sheet.clear();
していますが、日次で行を追加していきたい場合などはクリアせずに追記していくことも可能です。
「リソース>現在のプロジェクトのトリガー」で新しいトリガーを追加します。 updateData1()
を好みに応じて例えば1時間に1度更新するように設定します。
スプレッドシートの機能を使ってグラフを適当に書きます。
共有したい人にスプレッドシートを共有します。
以上、ホストを用意しなくても良い。可用性が高そう。無料。手軽。グラフは共有している人に勝手に作ってもらえる点がいいかなと思っています。
参考:
- https://developers.google.com/apps-script/guides/jdbc
- https://developers.google.com/apps-script/reference/spreadsheet/
Security consideration
- DBがアクセス元 IP を制限している場合、ここに書いてある範囲を許可します。許可したくない場合はこの方法は使えません。当然ですがインターネットからアクセス不能なDBの場合にも使えません。
- AppsScript にデータベースのアクセスアカウントを記載することになります。公開されるわけではありませんが、何らかの事故により漏洩するリスクが全く無いとは言い切れません。必要最小限のテーブルを読み取れるアカウントを使ったほうが良いです。そもそもアカウントを外部サービスに書きたくない場合はこの方法は使えません。