🍷
スプレッドシートの1行目のヘッダーのネスト構造を維持しながらJSONに書き出すGASコード
function exportSheetToNestedJSON() {
// スプレッドシートとシートを取得
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getActiveSheet();
// シートの全データを取得
const values = sheet.getDataRange().getValues();
// JSONオブジェクトを作成
let jsonObj = [];
const headers = values[0]; // 1行目をヘッダーとして使用
// 2行目(データ行)からループ
for (const row of values.slice(1)) {
let tempObj = {};
let icons = []; // icons配列を初期化
let categories = []; // category配列を初期化
let tags = []; // tag配列を初期化
let power = {}; // powerオブジェクトを初期化
for (const index in row) {
if (row[index] === "") continue; // 値が空のフィールドを除外
// キーを分割
const keys = headers[index].split('.');
let currentObj = tempObj;
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (!isNaN(key)) {
if (!icons[key]) {
icons[key] = {};
}
currentObj = icons[key];
continue;
}
if (key === 'category') {
categories.push(row[index]);
break;
}
if (key === 'tag') {
tags.push(row[index]);
break;
}
if (key === 'power') {
if (!power[keys[i + 1]]) {
power[keys[i + 1]] = {};
}
power[keys[i + 1]][keys[i + 2]] = row[index];
break;
}
if (i === keys.length - 1) {
currentObj[key] = row[index];
} else {
if (!currentObj[key]) {
currentObj[key] = {};
}
currentObj = currentObj[key];
}
}
}
if (icons.length > 0) {
tempObj.icons = icons;
}
if (categories.length > 0) {
tempObj.category = categories;
}
if (tags.length > 0) {
tempObj.tag = tags;
}
if (Object.keys(power).length > 0) {
tempObj.power = power;
}
jsonObj.push(tempObj);
}
// JSON文字列に変換
const jsonString = JSON.stringify(jsonObj, null, 2);
// Blobオブジェクトを作成
const blob = Utilities.newBlob(jsonString, 'application/json', 'spreadsheet_data.json');
// GoogleドライブにJSONファイルとして保存
const folder = DriveApp.getRootFolder(); // ルートフォルダに保存
const file = folder.createFile(blob);
Logger.log('JSONファイルが作成されました: ' + file.getUrl());
}
複数のWebサイトの更新管理に使うスプレッドシートで、スプレッドシートの1行目のヘッダーをネスト構造を維持しながらJSONに書き出すGASのコード例です。
Discussion