質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

2468閲覧

スプレッドシートからJSONに指定パターンに出力したい。

atk_3

総合スコア43

JSON

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/09/08 12:14

編集2020/09/08 12:25

前提・実現したいこと

多言語化の実装にあたり、スプレッドシートにてテキストの管理を行いたいと思っていたのですが、
その際にしていしたパターンで出力したいのですが実現できずにお力を貸していただきたいです。

イメージ説明

今回想定しているスプレッドシートは添付画像にて
「日本語・英語・中国語」の3つの言語を扱います。

json

1[ 2 { 3 "id_01": "タイトル", 4 "id_02": "テキスト" 5 } 6]

上記のような形で出力(**id_??**の部分は固定でタイトルやテキストの部分をJSON出力の際に指定の言語を選んで分けたいと考えております。)

現在の出力

json

1[ 2 { 3 "id_01,id_02,id_03,id_04,id_05...": "タイトル", 4 "id_01,id_02,id_03,id_04,id_05...": "テキスト" 5 } 6]

該当のソースコード

gs

1//ダウンロードダイヤログ表示 2function toJSON() { 3 var dl_html = HtmlService.createTemplateFromFile("dl_dialog").evaluate(); 4 SpreadsheetApp.getUi().showModalDialog(dl_html, "JSONファイルをダウンロード"); 5} 6 7//データ取得 8function getData_Ja() { 9 var sheet = SpreadsheetApp.getActiveSheet(); 10 var maxRow = sheet.getLastRow(); 11 var maxColumn = sheet.getLastColumn(); 12 var keys = []; 13 var data = []; 14 15 //keysデータ格納配列 16 for (var x = 2; x <= maxRow; x++) { 17 keys.push(sheet.getRange(x, 1).getValue()); 18 } 19 20 //JSONデータ格納配列 21 for (var y = 2; y <= maxRow; y++) { 22 var json = {}; 23 json[keys] = sheet.getRange(y, 2).getValue(); 24 25 //データ格納 26 data.push(json); 27 } 28 29 //整形してテキストにします 30 return JSON.stringify(data, null, '\t'); 31} 32 33//スプレッドシート読み込み時に実行 34function onOpen() { 35 //メニューバーにJSON出力用メニューを追加 36 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 37 var entries = [{ 38 name : "JSONで出力", 39 functionName : "toJSON" 40 }]; 41 spreadsheet.addMenu("JSON", entries); 42};

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <script type='text/javascript'> 6 //ダウンロード実行 7 function handleDownload_Ja() { 8 //JSONデータの取得 9 var content = <?= getData_Ja(); ?>; 10 //ダウンロード用URL生成 11 var blob = new Blob([ content ], { "type" : "application/json"}); 12 document.getElementById("download_ja").href = window.URL.createObjectURL(blob); 13 } 14 </script> 15 </head> 16 <body> 17 <!-- JSONダウンロードボタン:json名は適宜設定してください--> 18 <a id="download_ja" href="#" download="top_Ja.json" onclick="handleDownload_Ja()">日本語ダウンロード</a> 19 <a id="download_en" href="#" download="top_En.json" onclick="handleDownload_En()">英語ダウンロード</a> 20 <a id="download_ch" href="#" download="top_Ch.json" onclick="handleDownload_Ch()">中国語ダウンロード</a> 21 </body> 22 <style> 23 a { 24 display: block; 25 color: #000; 26 line-height: 2; 27 } 28 </style> 29</html>

試したこと

toJSON()にてダイヤログを読み込ませ、ダイアログのテンプレートを作成しているhtmlで言語の選択をするようにしたいと考えていました。
そのため現在は日本語ようの関数しか用意しておりません。。

javascriptの知識や配列に対しての知識がまだまだ未熟でうまくできずにおります。
よろしくお願い致します

参考サイト

https://kuwk.jp/blog/spreadsheet2json/
https://qiita.com/cazimayaa/items/224daebe536799e5a8a2
https://tech-cci.io/archives/1377

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

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

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

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

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

guest

回答1

0

ベストアンサー

これで大丈夫だと思いますが
試してみて下さい。

gs

1//ダウンロードダイヤログ表示 2function toJSON() { 3 var dl_html = HtmlService.createTemplateFromFile("dl_dialog").evaluate(); 4 SpreadsheetApp.getUi().showModalDialog(dl_html, "JSONファイルをダウンロード"); 5} 6 7//データ取得 8function getData(language) { 9 var sheet = SpreadsheetApp.getActiveSheet(); 10 var maxRow = sheet.getLastRow(); 11 var maxColumn = sheet.getLastColumn(); 12 var key = ''; 13 var data = []; 14 Var languageColumn = language + 2; // 取得する言語の列位置 15 16 //JSONデータ格納配列 17 for (var y = 2; y <= maxRow; y++) { 18 var json = {}; 19 key = sheet.getRange(y, 1).getValue(); // キーは1列目 20 json[key] = sheet.getRange(languageColumn, 2).getValue(); 21 22 //データ格納 23 data.push(json); 24 } 25 26 //整形してテキストにします 27 return JSON.stringify(data, null, '\t'); 28} 29 30//スプレッドシート読み込み時に実行 31function onOpen() { 32 //メニューバーにJSON出力用メニューを追加 33 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 34 var entries = [{ 35 name : "JSONで出力", 36 functionName : "toJSON" 37 }]; 38 spreadsheet.addMenu("JSON", entries); 39};

HTML

1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <script type='text/javascript'> 6 //ダウンロード実行 7 function handleDownload(language) { 8 //JSONデータの取得 9 var content = <?= getData(language); ?>; 10 //ダウンロード用URL生成 11 var blob = new Blob([ content ], { "type" : "application/json"}); 12 document.getElementById("download_ja").href = window.URL.createObjectURL(blob); 13 } 14 </script> 15 </head> 16 <body> 17 <!-- JSONダウンロードボタン:json名は適宜設定してください--> 18 <a id="download_ja" href="#" download="top_Ja.json" onclick="handleDownload(0)">日本語ダウンロード</a> 19 <a id="download_en" href="#" download="top_En.json" onclick="handleDownload(1)">英語ダウンロード</a> 20 <a id="download_ch" href="#" download="top_Ch.json" onclick="handleDownload(2)">中国語ダウンロード</a> 21 </body> 22 <style> 23 a { 24 display: block; 25 color: #000; 26 line-height: 2; 27 } 28 </style> 29</html>

投稿2020/09/21 16:53

編集2020/09/21 16:54
kuma_kuma_

総合スコア2506

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

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

atk_3

2020/09/23 11:29

回答ありがとうございます。 自分なりに読み解いてみました! 一点スクリプト実行時に ReferenceError: language is not defined となりまして、languageを変数として持つとしてHTML上のhandleDownload(数字)を取得するべきでしょうか?
atk_3

2020/09/24 04:27

一度動作確認をとりたかったのですが、回答頂いたコードをコピペで対応したところ ReferenceError: language is not defined と出てしまったのでどうしてだろう?と考えていたところでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問