🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

2回答

3925閲覧

GASでJSONを任意の出力形式にしたい

southern_flavor

総合スコア70

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2019/12/17 16:11

編集2019/12/18 05:26

やりたいこと

Google apps scriptにてスプレッドシートに書かれた内容を任意の形式でJSONにしたいです。
スプレドシートの内容はこんな感じです。
|region|pref|shop_type|shop_name|shop_address|
|:--|:--:|
|関東|東京都|健康食品|ショップA|ショップAについて|
|関東|東京都|生鮮食品|ショップB|ショップBについて|
|東北|青森県|お菓子|ショップC|ショップCについて|
|東北|青森県|ギフト|ショップD|ショップDについて|

やりたいJSON形式は次ようにネストにしたいです。

JSON

1[ 2  { 3    "region": "関東", 4    "pref": "東京都", 5    "detail": [ 6      { 7        "store_detail": [ 8          { "shop_type": "健康食品" }, 9          { "shop_name": "ショップA" }, 10          { "shop_address": "ショップAについて" } 11        ] 12      }, 13      { 14        "store_detail": [ 15          { "shop_type": "生鮮食品" }, 16          { "shop_name": "ショップB" }, 17          { "shop_address": "ショップBについて" } 18        ] 19      } 20    ] 21  }, 22  { 23    "region": "東北", 24    "pref": "青森県", 25    "detail": [ 26      { 27        "store_detail": [ 28          { "shop_type": "お菓子" }, 29          { "shop_name": "ショップC" }, 30          { "shop_address": "ショップCについて" } 31        ] 32      }, 33      { 34        "store_detail": [ 35          { "shop_type": "ギフト" }, 36          { "shop_name": "ショップD" }, 37          { "shop_address": "ショップDについて" } 38        ] 39      } 40    ] 41  } 42]

現状

配列の内容をいろいろ変えてみたりしたのですが、どうもうまくいきませんでした。
exceptIndexArrayに連想配列を入れるのは間違いでしょうか。
アドバイスや方法等、わかる方がいらっしゃればご教授いただけますと幸いです。

現在のGASのコードです。

GAS

1function doGet() { 2 //スプレットシート(account)の情報を取得 3 var sheet = SpreadsheetApp.getActive().getSheetByName('sheet1'); 4 //dataへ変換 5 var dataArray = convSheet(sheet); 6 7 //dataをJsonに変換し、新規シート出力 8 creatNewSheet(dataArray); 9 } 10 11//data(配列)へ変換関数 12 function convSheet(sheet) { 13 //内容開始行番号 14 var rowIndex=2; 15 //列開始行番号 16 var colStartIndex = 1; 17 //行番号 18 var rowNum = 1; 19 //最初行領域 20 var firstRange = sheet.getRange(1, 1, 1, sheet.getLastColumn()); 21 //Logger.log('firstRange:'+JSON.stringify(firstRange)); 22 var firstRowValues = firstRange.getValues(); 23 //Logger.log('firstRowValues:'+JSON.stringify(firstRowValues)); 24 //項目情報取得 25 var titleColumns = firstRowValues[0]; 26 27 var iregion = titleColumns.indexOf('region'); 28 var ipref = titleColumns.indexOf('pref'); 29 var ishoptype = titleColumns.indexOf('shop_type'); 30 var ishopname = titleColumns.indexOf('shop_name'); 31 var ishopadd = titleColumns.indexOf('shop_address'); 32 //Logger.log('indexName: '+indexName+' '+'indexDepCd: '+indexDepCd+' '+'indexDepNm: '+indexDepNm+' ' 33 // +'indexTeamCd: '+indexTeamCd+' '+'indexTeamNm: '+indexTeamNm); 34 var exceptIndexArray =[{'detail':[{'store':[{'content': 'hoge'}]}],'iregion':iregion,'pref':ipref,'shop_type':ishoptype,'shop_name':ishopname,'shop_address':ishopadd }]; 35 //Logger.log('exceptIndexArray: '+exceptIndexArray); 36 37 //最後の行番号 38 var lastRow = sheet.getLastRow(); 39 //Logger.log('lastRow:'+JSON.stringify(lastRow)); 40 //内容情報取得配列 41 var rowValues = []; 42 //内容取得 43 for(rowIndex; rowIndex<=lastRow; rowIndex++) { 44 var range = sheet.getRange(rowIndex, colStartIndex, rowNum, sheet.getLastColumn()); 45 var values = range.getValues(); 46 //内容情報にPUSH 47 rowValues.push(values[0]); 48 } 49 //Logger.log('rowValues:'+JSON.stringify(rowValues)); 50 51 //Json形式配列 52 var dataArray = []; 53 for(var i=0; i<rowValues.length; i++) { 54 //内容の行情報 55 var line = rowValues[i]; 56 //JsonObject 57 var json = new Object(); 58 //初期Json 59 var firstJson = new Object(); 60 61 json[line[iregion]] = firstJson; 62 63 //残りJson作成 64 for(var j=0; j<titleColumns.length; j++) { 65 //最初Json除外 66 if(0>exceptIndexArray.indexOf(j)){ 67 json[titleColumns[j]] = line[j]; 68 } 69 } 70 //data格納 71 dataArray.push(json); 72 } 73 //「dataArray」ログ確認 74 Logger.log(exceptIndexArray); 75 return dataArray; 76 } 77 78function creatNewSheet(dataArray){ 79 //data(配列)よりJsonへ変換 80 var json = JSON.stringify(dataArray); 81 82 //出力 83 //msgBox出力 84 //Browser.msgBox(json); 85 86 //新規シート名(日付) 87 var date = new Date(); 88 var newSheetName = date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate(); 89 //新規シート初期化 90 var newSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(newSheetName); 91 92 //存在有無確認 93 //存在しない場合 94 if(!newSheet){ 95 //シート生成 96 newSheet = SpreadsheetApp.getActiveSpreadsheet(); 97 newSheet.insertSheet(newSheetName); 98 //データ入力 99 newSheet.getRange("A1").setValue(json); 100 //存在する場合 101 }else{ 102 //データの書換え 103 newSheet.getRange("A1").setValue(json); 104 } 105 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2019/12/19 01:49

「JSONにしたい」とはどういう意味ですか?JSONファイルを作成するのか、JSONでリクエストを返すのか、それ以外なのか。
southern_flavor

2019/12/20 00:25

後者のjsonでリクエストを返す、です。 gasを実行すると新規シートにjsonが出力されるようになっています。 よろしくお願いします。
macaron_xxx

2019/12/20 00:34

>gasを実行すると新規シートにjsonが出力されるようになっています。 意味がわからないのですが、スプレッドシートにjsonが出力されるとはどういうことですか? 言っていることとやっていることが全然違うように思うのですが。 ファイルを出力したいの?リクエストを返したいの?
southern_flavor

2019/12/20 00:42

すみません。 私の書き方が悪かったようです。 jsonでファイルを作成=jsonファイルとしてダウンロード可 jsonでリクエストを返す=ファイルとしてではなく、jsonの内容を別シートに出力 といった認識だったのですが、誤りはありますか?
macaron_xxx

2019/12/20 00:53

はい、誤りがあります。 jsonでリクエストを返すとは、いわゆるWebAPIみたいなことで、HTMLレスポンスとして返します。 ただ、southern_flavorさんのやりたいことはわかりました。
macaron_xxx

2019/12/20 01:10

regionに対するprefは配列にならなくていいのでしょうか?
southern_flavor

2019/12/21 13:58

認識の誤りについてご指摘ありがとうございます。 prefは配列にするべきですね。 こちらも一旦、やってみます。 ありがとうございました。
guest

回答2

0

ベストアンサー

ちょっと雑ですが、概ねこんな感じですかね?

javascript

1function convSheet(sheet) { 2 var data = sheet.getDataRange().getValues(); 3 4 var titleColumns = data[0]; 5 6 var iregion = titleColumns.indexOf('region'); 7 var ipref = titleColumns.indexOf('pref'); 8 var ishoptype = titleColumns.indexOf('shop_type'); 9 var ishopname = titleColumns.indexOf('shop_name'); 10 var ishopadd = titleColumns.indexOf('shop_address'); 11 12 //Json形式配列 13 var dataArray = []; 14 var dataDic = {}; 15 for(var i = 1; i < data.length; i++) { 16 var rowData = data[i]; 17 var key = rowData[iregion] + '|' + rowData[ipref]; 18 19 if (dataDic[key] !== undefined) { 20 dataArray[dataDic[key]]['detail'].push( 21 { 22 "store_detail": [ 23 { "shop_type": rowData[ishoptype] }, 24 { "shop_name": rowData[ishopname] }, 25 { "shop_address": rowData[ishopadd] } 26 ] 27 } 28 ); 29 } else { 30 dataDic[key] = dataArray.push( 31 { 32 "region": rowData[iregion], 33 "pref": rowData[ipref], 34 "detail": [ 35 { 36 "store_detail": [ 37 { "shop_type": rowData[ishoptype] }, 38 { "shop_name": rowData[ishopname] }, 39 { "shop_address": rowData[ishopadd] } 40 ] 41 } 42 ] 43 } 44 ) - 1; 45 } 46 } 47 48 return dataArray; 49}

投稿2019/12/20 01:31

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

southern_flavor

2019/12/21 13:57

ご回答ありがとうございます。 こちらのコードを試したところ、想定通りに動きました。 prefを配列にしたいので、こちらを参考に試してみます。 ありがとうございました!
guest

0

質問をよく見ずにURLだけ貼る。
検索内容

投稿2019/12/19 17:25

mike2mike4

総合スコア935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

southern_flavor

2019/12/20 00:27

ありがとうございます。 私の方でも何度か調べており、スプレッドシートからjsonを作成する方法はいろいろ出てくるのですが、多次元配列で出力する方法がなく、質問させていただいた次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問