🍷

スプレッドシートの1行目のヘッダーのネスト構造を維持しながらJSONに書き出すGASコード

2024/08/02に公開
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