GASでスプレッドシートから複数のJSONを生成し、ZIPで固めてダウンロードしたいと思ったけど意外とめんどくさかったのでまとめます。
JSONを作成する
次のようなスプレッドシートの表から
no | name | age |
---|---|---|
01 | mako | 18 |
02 | neko | 19 |
各行に対して、次のようなJSONを作成する
{
"no": "1",
"name": "mako",
"age": "18"
}
// スプレッドシートを読み込み
const sheet = SpreadsheetApp.getActiveSheet();
// データが存在する行までループする
for (let i = 2; i <= sheet.getLastRow(); i++) {
const data = {
"no": sheet.getRange(i, 1).getValue(),
"name": sheet.getRange(i, 2).getValue(),
"age": sheet.getRange(i, 3).getValue(),
};
console.log(JSON.stringify(data));
}
ZIPファイルを作成する
Utilities.zip関数を利用する必要があります。
const zip = Utilities.zip(blobs, 'hoge.zip');
第一引数にはblobsを取るので、jsonをblobに変換しその配列を取得します。
blobを生成するにはUtilities.newBlob関数を利用します。
const blobs = new Array();
const blob = Utilities.newBlob(JSON.stringify(data, null, 4), 'application/json', (i-1).toString() + '.json');
blobs.push(blob);
ZIPファイルを保存する
GASから直接ダウンロードができないので、一旦Google Drive上にZIPファイルを保存します。
const folder = DriveApp.getFolderById('FolderId');
folder.createFile(zip);
ここまでの全体のコード
function toJsons() {
// スプレッドシートを読み込み
const sheet = SpreadsheetApp.getActiveSheet();
const blobs = new Array();
// データが存在する行までループする
for (let i = 2; i <= sheet.getLastRow(); i++) {
const data = {
"no": sheet.getRange(i, 1).getValue(),
"name": sheet.getRange(i, 2).getValue(),
"age": sheet.getRange(i, 3).getValue(),
};
const blob = Utilities.newBlob(JSON.stringify(data, null, 4),'application/json',(i-1).toString() + '.json');
blobs.push(blob);
}
// 任意のフォルダにZIPファイルを保存する
const folder = DriveApp.getFolderById('hogehoge');
const zip = Utilities.zip(blobs, 'jsons.zip');
folder.createFile(zip);
}
ZIPファイルのダウンロード
toJsons関数を実行すると指定したフォルダにZIPファイルが保存されるのでダウンロードするだけです。