Last active
December 7, 2016 05:47
-
-
Save ryz310/a4ec4639f0410545cb5eaf775c6ad783 to your computer and use it in GitHub Desktop.
Google スプレッドシートのスクリプトから DB に接続して結果をスプレッドシートに展開する。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 使用例 | |
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