スプレッドシートを使って作ったファイルをCSVにしてファイル取り込みする業務があったので、CSVを出力するツールを作成してみました。
列や行が増えても減っても問題なく出力できるので、ぜひ利用使ってみて下さい。
使い方
使い方とスプレッドシートツールの仕様を解説します。
GoogleSpreadSheetをコピーしておく
以下からSpreadSheetを開きます。
閲覧専用なので、コピーして保存をしてください。
「ファイル」→「コピーを作成」の順で保存できます。
これで、編集ができるようになります。
スプレッドシートの仕様
「出力元シート」に入力したデータがCSVとして出力されます。
■出力される場所
スプレッドシートが存在している場所と同じ場所にCSVが出力されます。
■出力される範囲
入力した最終列×最終行のデータです。
そのため、列や行数は変わった場合、変わった分だけCSVにも反映されます。
■文字コード
Shift-JISです。
出力方法
出力ボタンをクリックします。
①成功した場合
CSVダウンロードURLが表示されます。
赤枠箇所をクリックしてください。
その後、右上のダウンロードボタンを押すとCSVがダウンロードできます。
出力場所はスプレッドシートがある場所と同じフォルダです。
②出力が失敗した場合
エラーメッセージが表示されます。
プログラムが読める方に確認をお願いします。
初めて実行する場合、実行承認・許可が必要
「出力」ボタンを始めて押した場合、メッセージが表示されます。
以下の順で許可をしてください。
①続行をクリック
②使っているGoogleアカウントを選んでログイン
③詳細をクリックして、「安全ではないページに移動」
④一番下の許可を押す
コード解説
ソースコード
コードも公開しておきます。
もちろんスプレッドシートから開くこともできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
/** * CSV出力する */ function functionOutputCSV() { try { var csvOutputData = {} var outputSheet = "" let menuSheet ="" var fileId = "" var folderId = "" //シート情報をセット SpreadsheetApp.getActiveSpreadsheet().getSheetByName("出力元シート").activate(); outputSheet = SpreadsheetApp.getActiveSheet(); SpreadsheetApp.getActiveSpreadsheet().getSheetByName("メニュー").activate(); //menuSheet = SpreadsheetApp.getActiveSheet(); //エラー出力セルをクリア menuSheet.getRange(3, 3).setValue(""); //csvULRセルをクリア menuSheet.getRange(2, 3).setValue(""); //▼▼▼▼▼▼▼CSV出力する範囲を取得▼▼▼▼▼▼▼ //最終列を取得する(行の先頭列から右方向に取得する) var lastCol = outputSheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn(); //A列の最終行のセルを取得(先頭行から下方向に取得する) var lastRow = outputSheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); //CSV出力する範囲を取得 var outputRange = outputSheet.getRange(1, 1, lastRow, lastCol); //▲▲▲▲▲▲▲CSV出力する範囲を取得▲▲▲▲▲▲▲ //▼▼▼▼▼▼▼出力範囲のデータを文字で区切る▼▼▼▼▼▼▼ //配列へシート全体を読み込む var values = outputSheet.getDataRange().getValues() //二次元配列をカンマ区切りの文字列に変換 csvOutputData = values.join('\n'); //▲▲▲▲▲▲▲出力範囲のデータを文字で区切る▲▲▲▲▲▲▲ //▼▼▼▼▼▼▼スプレッドシートと同じフォルダにCSVを出力する▼▼▼▼▼▼▼ //ファイル名セット var now = new Date(); //現在日時を取得 var fileName ="出力CSV" +Utilities.formatDate(now, 'JST', 'yyyyMMdd-HHmmss') + ".csv" //スプレッドシートのあるフォルダID取得 folderId = getSSFolderId() //CSVを同じフォルダに出力 fileId = createCsvFile_(folderId,fileName,csvOutputData) //CSVのURLをスプレッドシートに記入 menuSheet.getRange(2, 3).setValue("https://drive.google.com/file/d/"+fileId); //▲▲▲▲▲▲▲スプレッドシートと同じフォルダにCSVを出力する▲▲▲▲▲▲▲ } catch (e) { //エラーをメニューシートに記入する SpreadsheetApp.getActiveSpreadsheet().getSheetByName("メニュー").activate(); menuSheet = SpreadsheetApp.getActiveSheet(); menuSheet.getRange(3, 3).setValue("エラー:" + e.message + "\n情報:" + e.stack); } } /** * CSVファイル書き出し * @param {string} folderId フォルダID * @param {string} fileName ファイル名 * @param {string} contents ファイルの内容 * @return {string} 出力したファイルのID */ function createCsvFile_(folderId, fileName, contents) { // コンテンツタイプ const contentType = 'text/plain'; // 文字コード //const charset = 'UTF-8'; const charset = 'Shift_JIS'; // 出力するフォルダ const folder = DriveApp.getFolderById(folderId); // Blob を作成する const blob = Utilities.newBlob('', contentType, fileName).setDataFromString(contents, charset); // ファイルに保存 var file = folder.createFile(blob); //出力したCSVファイルのファイルIDを取得 fileId = file.getId(); return fileId; } /** * スプレッドシート自身のフォルダIDを取得する * @return {string} スプレッドシートが存在しているフォルダのID */ function getSSFolderId() { // 自身のスプレッドシートのIDを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); var ssId = ss.getId(); // スプレッドシートIDを取得 var parentFolder = DriveApp.getFileById(ssId).getParents(); // IDからスプレッドシートのファイルを取得⇒親フォルダを取得 var folderId = parentFolder.next().getId(); // 親フォルダIDを取得 return folderId; } |
全体解説
流れとしては以下のようになっています。
①CSV出力する範囲を取得(25行目~32行目)
②出力範囲のデータを文字で区切る(35行目~41行目)
③スプレッドシートと同じフォルダにCSVを出力する(25行目~32行目)
サンプルの個人情報データは以下から作っているダミーデータです。
・【GAS】1行で書ける!特定列の最終行・特定行の最終列を取得する方法
https://moripro.net/gas-get-specified-lastcol-lastrow/
・【GASで時短】選択範囲のデータをCSVで出力するhttps://myfunc.jp/items/00041/index.html
・個人情報テストデータジェネレーター