34
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoogleドライブのスプレッドシートでJson出力

Posted at

#はじめに
アプリで使うマスターデーターとかさっとスプレッドで書いてそのままJSONで出力したい。。

#スプレッドの仕様
以下のようなスプレッドを作ります。
スクリーンショット 2014-07-25 19.53.35.png
このスプレッドで設定したシート名と同じ名前のシートを1つのテーブルとして使います。

##ほげマスター
スクリーンショット 2014-07-25 19.53.51.png
##もげマスター
スクリーンショット 2014-07-25 19.54.06.png

これをドライブのルートにフォルダ掘って出力するスクリプトです。
スクリーンショット 2014-07-25 19.52.57.png

#ソース

var SHEET_NAME = 'エンティティ一覧';

function exportHelloMaster() {
  var sheetName = SHEET_NAME;
  
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = book.getSheetByName(sheetName);
  exportJson(sheet);
    
}

function exportJson(sheet){
  // first line(title)
  var colStartIndex = 2;
  var rowNum = 1;
  var firstRange = sheet.getRange(1, colStartIndex, 1, 4);
  var firstRowValues = firstRange.getValues();
  var titleColumns = firstRowValues[0];
  
  // after the second line(data)
  var lastRow = sheet.getLastRow();
  var rowValues = [];
  for(var rowIndex=2; rowIndex<=lastRow; rowIndex++) {
    var rowNum = 1;
    var range = sheet.getRange(rowIndex, colStartIndex, rowNum, 4);
    var values = range.getValues();
    rowValues.push(values[0]);
  }
  
  // create json
  var jsonArray = [];
  for(var i=0; i<rowValues.length; i++) {
    var line = rowValues[i];
    var json = new Object();
    for(var j=0; j<titleColumns.length; j++) {
      json[titleColumns[j]] = line[j];
    }
    jsonArray.push(json);
  }
  
  var objDate=new Date();
  var Year = objDate.getFullYear();
  var Month = objDate.getMonth()+1;
  var Week = objDate.getDay();
  var Day = objDate.getDate();
  var Hour = objDate.getHours();
  var Minute = objDate.getMinutes();
  var Second = objDate.getSeconds();
  
  var targetFolder = DriveApp.createFolder("HogeMoge_OutputMaster_"+Year+Month+Day+"_"+Hour+Minute+Second);
  
  var book = SpreadsheetApp.getActiveSpreadsheet();

  for(var i=0; i<jsonArray.length; i++){
    if(!jsonArray[i]["論理名/シート名"]){
      continue;
    }
    var masterSheet = book.getSheetByName(jsonArray[i]["論理名/シート名"]);
    var json = convertSheet2JsonText(masterSheet);
    var file = targetFolder.createFile(jsonArray[i]["物理名/jsonファイル名"] + ".json", JSON.stringify(json));
  }
}

function convertSheet2JsonText(sheet) {
  var colStartIndex = 2;
  var titleRowIndex = 3;
  var valuesRowIndex = 4;
  var rowNum = 1;
  var firstRange = sheet.getRange(titleRowIndex, colStartIndex, 1, sheet.getLastColumn());
  var firstRowValues = firstRange.getValues();
  var titleColumns = firstRowValues[0];
  
  var lastRow = sheet.getLastRow();
  var rowValues = [];
  for(var rowIndex=valuesRowIndex; rowIndex<=lastRow; rowIndex++) {
    var rowNum = 1;
    var range = sheet.getRange(rowIndex, colStartIndex, rowNum, sheet.getLastColumn());
    var values = range.getValues();
    rowValues.push(values[0]);
  }
  
  // create json
  var jsonArray = [];
  for(var i=0; i<rowValues.length; i++) {
    var line = rowValues[i];
    var json = new Object();
    for(var j=0; j<titleColumns.length; j++) {
      json[titleColumns[j]] = line[j];
    }
    jsonArray.push(json);
  }
  return jsonArray;
}

最初に作ったときに参考にしたブログのURLが失念してしまいました。
VBAで作った時はもう少し苦労したけどjsonは相性いいっすね。
とっても簡単。

34
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?