Skip to content

Instantly share code, notes, and snippets.

@ryz310
Last active December 7, 2016 05:47
Show Gist options
  • Save ryz310/a4ec4639f0410545cb5eaf775c6ad783 to your computer and use it in GitHub Desktop.
Save ryz310/a4ec4639f0410545cb5eaf775c6ad783 to your computer and use it in GitHub Desktop.
Google スプレッドシートのスクリプトから DB に接続して結果をスプレッドシートに展開する。
// 使用例
function example() {
renderQueryResult('シート名', query(), 'A2', 'U1');
}
// SQL は <xml><![CDATA[;]] で囲むと吉。
function query() {
return <xml><![CDATA[
select
*
from
hoge
;]]>
</xml>
}
// 指定したシートの任意の場所にSQL実行結果を展開する
// sheet_name: 対象となるシート名
// query: 実行する SQL
// result_position: 結果を書き込む先の位置(例: "A3")
// time_stump_position: 最終実行日時を書き込む先の位置(例: "A3")
// append: true を指定すると、結果を上書きせずに追記する。デフォルトは false。
function renderQueryResult(sheet_name, query, result_position, time_stump_position, append) {
if (append == null) append = false;
var sheet = spreadSheet(sheet_name);
var col_start = sheet.getRange(result_position).getColumn();
var row_start = sheet.getRange(result_position).getRow();
dbExecute(query, function(results) {
var numCols = results.getMetaData().getColumnCount();
var row = row_start;
if (append) { while (!sheet.getRange(row, col_start).isBlank()) { row++; } }
while (results.next()) {
for (var col = 1; col <= numCols; col++) {
sheet.getRange(row, col + col_start - 1).setValue(results.getString(col));
}
row++;
}
timeStump(sheet, time_stump_position);
});
}
// 指定したシートの最終行にSQL実行結果を追記する
// sheet_name: 対象となるシート名
// query: 実行する SQL
// result_position: 結果を書き込む先の位置(例: "A3")
// time_stump_position: 最終実行日時を書き込む先の位置(例: "A3")
function appendQueryResult(sheet_name, query, result_position, time_stump_position) {
renderQueryResult(sheet_name, query, result_position, time_stump_position, true);
}
// 指定した名前のシートインスタンスを取得する
function spreadSheet(name) {
return SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name);
}
// 指定したシートの任意の場所にタイムスタンプを記録する。
function timeStump(sheet, position) {
var time_stump = '最終更新日時: ' + new Date().toLocaleString();
sheet.getRange(position).setValue(time_stump);
}
// DBに接続し、query の実行結果を yield に引数として渡して実行する。
function dbExecute(query, yield) {
dbConnection(function(conn) {
var stmt = conn.createStatement();
var results = stmt.executeQuery(query);
yield(results);
results.close();
stmt.close();
});
}
// DBに接続し、connection を yield に引数として渡して実行する。
function dbConnection(yield) {
var address = '????';
var user = '????';
var password = '????';
var db = '????';
var dbUrl = 'jdbc:mysql://' + address + '/' + db;
var conn = Jdbc.getConnection(dbUrl, user, password);
yield(conn);
conn.close();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment