以下のテンプレートスプレッドシートを作成
テンプレート:https://docs.google.com/spreadsheets/d/1xRyykZqF2-5Xqn_KQVob7UgAqpi_1V0lnJQSVrH0X8c/edit?usp=sharing
テンプレートシートのテーブル名、カラム名、値を作成したい内容で入力して以下のgoogle apps scriptコピペしexportInsertStatementsを実行すると、スプレッドシートと同じディレクトリにinsert_all.sqlが作成される。
function exportInsertStatements() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var allInsertSql = "";
// 全シートをループ
sheets.forEach(function(sheet) {
// テーブル名取得(B1セル)
var tableName = sheet.getRange("B1").getValue();
// テーブル名が空の場合はスキップ
if (!tableName) return;
// カラム名行(4行目)とデータ型行(5行目)を取得
var lastCol = sheet.getLastColumn();
var columnNames = sheet.getRange(4, 1, 1, lastCol).getValues()[0];
var dataTypes = sheet.getRange(5, 1, 1, lastCol).getValues()[0];
// 空でないカラム名のみを使用
columnNames = columnNames.filter(function(name) {
return name !== "" && name != null;
});
var colCount = columnNames.length;
var lastRow = sheet.getLastRow();
// データ行が無い場合はスキップ(6行目以降)
if (lastRow < 6) return;
// データ取得(6行目以降)
var data = sheet.getRange(6, 1, lastRow - 5, lastCol).getValues();
// 有効なカラム分だけ抽出
data = data.map(function(row) {
return row.slice(0, colCount);
});
// 全セルが空の行は除外
data = data.filter(function(row) {
return row.some(function(cell) {
return cell !== "" && cell != null;
});
});
// INSERT文のカラム部分生成
var columnsPart = "(" + columnNames.map(function(col) {
return "`" + col + "`";
}).join(", ") + ")";
// VALUES部生成(数値はそのまま、文字列はシングルクォートで囲む)
var valuesList = data.map(function(row) {
var valueStrings = row.map(function(val) {
if (typeof val === "number") {
return val;
} else if (val === null || val === "") {
return "NULL";
} else {
// シングルクォートのエスケープ処理
var escapedVal = String(val).replace(/'/g, "\\'");
return "'" + escapedVal + "'";
}
});
return "(" + valueStrings.join(", ") + ")";
});
var insertSql = "INSERT INTO `" + tableName + "` " + columnsPart + " VALUES\n " + valuesList.join(",\n ") + ";";
// シート名をコメントとして付与して、全INSERT文に追加
allInsertSql += "-- " + sheet.getName() + " シートのINSERT文\n" + insertSql + "\n\n";
});
// INSERT文が生成されなかった場合は通知して終了
if (allInsertSql === "") {
console.log("生成するINSERT文がありませんでした。" );
return;
}
// 出力ファイル作成処理
var fileName = "insert_all.sql";
var thisFileId = ss.getId();
var thisFile = DriveApp.getFileById(thisFileId);
var folder = thisFile.getParents().next(); // スプレッドシートが属するフォルダ
// 同名ファイルが存在すれば削除(上書きのため)
var existingFiles = folder.getFilesByName(fileName);
while (existingFiles.hasNext()) {
var f = existingFiles.next();
f.setTrashed(true);
}
// 新規ファイル作成
folder.createFile(fileName, allInsertSql);
console.log("INSERT文ファイルが生成されました: " + fileName);
}