スプレッドシートからjsonデータを作成することになり、それが多次元配列(?)だったので、参考サイトを元に作成しました。
参考サイト
シートの形
ソース
function getJsonData(){
//今開いているシートを取得する
var sheet = SpreadsheetApp.getActiveSheet();
//項目になる行までを入れる
var dataline = 3;
//最大行数から項目の行数を削り、値になる範囲までの行数にする
var maxline = sheet.getLastRow() - dataline;
// シートの一部分の値を取得する
// 1階層目
var keys01 = sheet.getSheetValues(1, 1, 1, sheet.getLastColumn())[0].filter(String);
var data01 = sheet.getRange(4, 1, maxline, 3).getValues();
// 2階層目
var keys02 = sheet.getSheetValues(2, 3, 1, 9)[0].filter(String);
var data02 = sheet.getRange(4, 3, maxline, 9).getValues();
// 3階層目
var keys03 = sheet.getSheetValues(3, 3, 1, 3)[0].filter(String);
var data03A = sheet.getRange(4, 3, maxline, 3).getValues();
var data03B = sheet.getRange(4, 6, maxline, 3).getValues();
var data03C = sheet.getRange(4, 9, maxline, 3).getValues();
//空の配列を作成
var list = [];
var list02 = [];
var dataA = [];
var dataB = [];
var dataC = [];
//data03の中に入るA~Cまでを作成
data02.forEach(function(elm,index){
var template = indexBy(keys02);
var member = generate(elm, template);
//まずはA~Cまでのsubject、time、scoreを作成
list02[index] = member;
//A~Cのsubject、time、scoreを入れていく
data03A.forEach(function (elm, index) {
var member = [];
var template = indexBy(keys03);
member.push(generate(elm, template));
dataA[index] = member;
});
data03B.forEach(function (elm, index) {
var member = [];
var template = indexBy(keys03);
member.push(generate(elm, template));
dataB[index] = member;
});
data03C.forEach(function (elm, index) {
var member = [];
var template = indexBy(keys03);
member.push(generate(elm, template));
dataC[index] = member;
});
//list02にA~Cを入れていく
list02[index].A = dataA[index]
list02[index].B = dataB[index]
list02[index].C = dataC[index]
});
data01.forEach(function(elm,index){
var template = indexBy(keys01);
var member = generate(elm, template);
//listにdata01、data02、data03を作成
list[index] = member;
//data03にlist02を入れる
list[index].data03 = list02[index]
});
return JSON.stringify(list, null, " ");
function generate(elm,obj){
var i = 0;
for(var key in obj){
obj[key] = elm[i];
i++;
}
return obj;
}
function indexBy(ary){
var obj = {};
for(var i = 0, len = ary.length; i < len; i++){
var key = ary[i];
obj[key] = key;
}
return obj;
}
結果
[
{
"data01": "学校01",
"data02": "会場01",
"data03": {
"A": [
{
"subject": "国語",
"time": 100,
"score": 100
}
],
"B": [
{
"subject": "数学",
"time": 90,
"score": 90
}
],
"C": [
{
"subject": "英語",
"time": 80,
"score": 80
}
]
}
},
{
"data01": "学校02",
"data02": "会場02",
"data03": {
"A": [
{
"subject": "国語",
"time": 110,
"score": 110
}
],
"B": [
{
"subject": "数学",
"time": 100,
"score": 100
}
],
"C": [
{
"subject": "英語",
"time": 90,
"score": 90
}
]
}
}
]
やったこと
参考サイトを元に、もう1つforEachの文を作成し、追加するようにした。
反省点
- 繰り返しやっている処理はもっと省略できると思う
- data3とかは、list02を入れるためにいったん適当な値を入れているが、空にする方法もあると思う
- 急ぎの中でやったので荒々しい