0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

google spreadsheetからinsert文を生成する

Posted at

以下のテンプレートスプレッドシートを作成
テンプレート:https://docs.google.com/spreadsheets/d/1xRyykZqF2-5Xqn_KQVob7UgAqpi_1V0lnJQSVrH0X8c/edit?usp=sharing

image.png

テンプレートシートのテーブル名、カラム名、値を作成したい内容で入力して以下の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);
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?