GASを使って、スプレッドシートの「特定シート」をCSVファイルにするスクリプトを紹介します。
上図のスプレッドシートの「シート1」を、このようなCSVファイルにします。
Contents
特定シートをCSVファイルにして保存する
シートをCSVファイルとしてエクスポートするメソッドってないの…?と探してみましたが、GASでは無いようです。
そこで、シートをCSVにする流れを以下にまとめてみました。順を追ってコードを作っていきます。
手っ取り早く完成コードだけ見たい!という方は【コードまとめ】シートをCSVファイルにするへジャンプしてください。
シートをCSVファイルとして保存する流れ
「シート」を「CSVファイル」にするには、下記の5処理をします。
- 【処理1】シートのデータ範囲を「二次元配列」で取得する
- 【処理2】「二次元配列」を「カンマ区切りの文字列(CSV)」にする(CSV = Comma Separated Value)
- 【処理3】処理2で作成したCSVから、Blobオブジェクトを作成する
- 【処理4】CSVファイルの保存先フォルダを指定
- 【処理5】処理3で作成したBlobオブジェクトからCSVファイルを作成する
【処理1】シートのデータ範囲を「二次元配列」で取得する
シートのデータ範囲を取得します。変数valuesに二次元配列が格納されています。
1 2 3 4 5 6 7 8 |
var sheetName = 'シート1'; //CSVファイルにするシート名を指定 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheetName); var values = sheet.getDataRange().getValues(); //データ範囲を二次元配列で取得 Logger.log(values); //[[品番, 商品名, 価格], [A001, えんぴつ, 100.0], [A002, 消しゴム, 150.0], [A003, ボールペン, 200.0]] |
【処理2】「二次元配列」を「カンマ区切りの文字列(CSV)」にする
二次元配列valuesに、Arrayオブジェクトのjoinメソッドで改行コード(\n)を付与して、変数csvに格納します。
変数csvの中身は、ログ出力で確認できるとおり、「カンマ区切りの文字列」です。
これは、「配列に文字列を付与すると全体が文字列になる」という仕組みを利用しています。二次元配列valuesに、文字列’\n’を付与することで、全体が文字列になります。
1 2 3 4 5 6 7 8 |
var csv = values.join('\n'); Logger.log(csv); /* 品番,商品名,価格 A001,えんぴつ,100 A002,消しゴム,150 A003,ボールペン,200 */ |
【処理3】処理2で作成したCSVから、Blobオブジェクトを作成する
文字列csvを利用して、Blobオブジェクトを作成します。UtilitiesクラスのnewBlobメソッドのリファレンスはこちら
1 |
var blob = Utilities.newBlob(csv, MimeType.CSV, sheetName + '.csv'); |
【処理4】CSVファイルの保存先フォルダを指定
「フォルダID」でフォルダを指定します。「フォルダID」とは、GoogleドライブのURLの folders/ 配下の文字列です。
(例)https://drive.google.com/drive/u/0/folders/1234567890-ABCDEFGHIJ
→フォルダIDは「1234567890-ABCDEFGHIJ」
1 2 |
var id = '********************'; //フォルダID var folder = DriveApp.getFolderById(id); |
【処理5】処理3で作成したBlobオブジェクトからCSVファイルを作成する
createFileメソッドでCSVファイルを作成します。
1 |
folder.createFile(blob); |
【コードまとめ】シートをCSVファイルにする
処理1~処理5をまとめたコードがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function createCSV() { var sheetName = 'シート1'; //CSVファイルにするシート名を指定 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheetName); //データ範囲を二次元配列で取得 var values = sheet.getDataRange().getValues(); //二次元配列をカンマ区切りの文字列に変換 var csv = values.join('\n'); //Blobオブジェクトの作成 var blob = Utilities.newBlob(csv, MimeType.CSV, sheetName + '.csv'); //CSVファイルの保存先フォルダを指定 var id = '********************'; //フォルダID var folder = DriveApp.getFolderById(id); //CSVファイルを作成 folder.createFile(blob); } |
【番外編】スプレッドシートと同じフォルダにCSVを保存する
前述のコードは、CSVファイルの保存先フォルダを「フォルダID」で指定しました。
処理対象のスプレッドシートが存在するフォルダと「同じフォルダ」にCSVファイルを保存することも可能です。
※Googleドライブでは、1つのファイルを複数フォルダに追加することができますが、このスクリプトは、1つのフォルダにのみ追加されていることを前提としています。
(参考)【GAS】Googleドライブでファイルが追加されている全てのフォルダを取得する
違いは18行目以降です。自身が存在するフォルダ(親フォルダ)を取得する関数「getParentFolder」を作り、18行目で呼び出しています。
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 |
function createCSV() { var sheetName = 'シート1'; //CSVファイルにするシート名を指定 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheetName); //データ範囲を二次元配列で取得 var values = sheet.getDataRange().getValues(); //二次元配列をカンマ区切りの文字列に変換 var csv = values.join('\n'); //Blobオブジェクトの作成 var blob = Utilities.newBlob(csv, MimeType.CSV, sheetName + '.csv'); //CSVファイルの保存先フォルダを指定 var folder = getParentFolder(ss); //CSVファイルを作成 folder.createFile(blob); } /* * スプレッドシートが存在するフォルダを取得する * ※前提:1つのフォルダにのみ存在すること * * @param {Object} スプレッドシート * @return {Object} フォルダ */ function getParentFolder(ss) { var ssId = ss.getId(); //スプレッドシートのIDを取得 var parentFolders = DriveApp.getFileById(ssId).getParents(); var parentFolder = parentFolders.next(); return parentFolder; } |
以上です!