ちょっとしたテストデータを作る時に、GoogleスプレッドシートのデータをJSON形式で欲しくなりました。
調べてみると、いい感じのコードを書いてる人がいたので、拝借しつつ、JSONファイルとしてダウンロード(エクスポート)できるようにしました。
やりたいこと
これを
id | name | twitter_id |
---|---|---|
1 | taro | taro_no_twitter |
2 | jiro | jiro_no_twitter |
3 | saburo | saburo_no_twitter |
こう変換します
[
{
"id": 1,
"name": "taro",
"twitter_id": "taro_no_twitter"
},
{
"id": 2,
"name": "jiro",
"twitter_id": "jiro_no_twitter"
},
{
"id": 3,
"name": "saburo",
"twitter_id": "saburo_no_twitter"
}
]
シートのフォーマットについて
- 1行目にはオブジェクトのキー名が入力されていること
- 2行目以降に値が入力されていること
結論のコード
toJson.gs
const getData = () => {
const sheet = SpreadsheetApp.getActiveSheet();
const arrays = sheet.getDataRange().getValues();
const [header, ...rows] = arrays;
return JSON.stringify(rows.map((row) =>
row.reduce((acc, cell, i) => ({ ...acc, [header[i]]: cell || null }), {})
));
};
/** スプレッドシート読み込み時に実行 */
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "JSONで出力",
functionName : "toJSON"
}];
// メニューバーにJSON出力用メニューを追加
spreadsheet.addMenu("JSON", entries);
};
/** ダウンロードダイアログ表示 */
function toJSON() {
// ダイアログテンプレート読み込み
var dl_html = HtmlService.createTemplateFromFile("dl").evaluate();
// ダイアログ表示
SpreadsheetApp.getUi().showModalDialog(dl_html, "JSONファイルをダウンロード");
}
ほぼコピペ
dl.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script type='text/javascript'>
//ダウンロード実行
function handleDownload() {
//JSONデータの取得
var content = <?= getData(); ?>;
//ダウンロード用URL生成
var blob = new Blob([content], { "type": "application/json" });
document.getElementById("download").href = window.URL.createObjectURL(blob);
}
</script>
</head>
<body>
<!-- JSONダウンロードボタン:json名は適宜設定してください-->
<a id="download" href="#" download="download_file.json" onclick="handleDownload()">ダウンロード</a>
</body>
</html>
スプレッドシートをリロードすると、こんな感じでメニューバーに追加され、jsonファイルとしてダウンロードできるようになります。
未実装のもの
全て文字列となるので、nullやbooleanやDate型は各自要件に応じて対応してください。
追記
- 空白のセルはnullとして扱うように修正しました
- 元々booleanやData型には自動変換してくれてました
- 空文字を扱いたい場合は
""
を使ってください
参考
ダウンロードUIの作り方