Google スプレッドシートを JSON 形式に変換する方法(サンプルコード付)[2022年版]
プログラムではデータを JSON 形式で扱いたいけど、管理はスプレッドシートでやっていきたい!
そんなことが結構ありましたので、方法を紹介していきます。
手軽さでは App Script 推しですが、どんな方法があるかも合わせて紹介していきます ('ω’)ノ
対象
今回は、これをJSON形式にしてみます。
方法① 手作業で頑張る
地道にタイピングする方法です。
やっぱり、仕事は 温かみのある方法 が一番!
評価:いやいや、無理!超たいへん!
これは、強靭な忍耐と精神を持ち、時間と気力があるエリートのための方法です。
方法② 正規表現で変換
エディタにコピーして、正規表現を使って変換する方法です。
息を吸うように書けると、すごい人に見えて評価があがるかも?
評価:毎回やるのは大変!
たとえば「秀丸」だと、こんな感じです。
タイプが1つしかないポケモンもいらっしゃいますので、2回にわけて置換します。
手順 ①
変換前: ^([^\t\n]+)\t([^\t\n]+)\t([^\t\n]+)$
変換後: { "num
"
: "\1", "name": "\2", "type1": "\3" },
手順 ②
変換前: ^([^\t\n]+)\t([^\t\n]+)\t([^\t\n]+)\t([^\t\n]+)$
変換後: { "num": "\1", "name": "\2", "type1": "\3", "type2": "\4" },
手順 ③
先頭に [
を書いて、末尾のレコードの ,
を ]
に変えて完成です。
方法③ App Script で変換 [おススメ!]
今回、私がおすすめする方法です!
評価:作業も管理もかんたん!
スプレッドシートの「拡張機能」から 「Apps Script」 を押します。
出てきた画面にこのコードをペタっと貼ります。
function myFunction() {
const inputSheetName = 'シート1'; // 入力データがあるシートの名前です。
const outputSheetName = 'JSON'; // JSONを出力するシートの名前です。
const inputSheet = SpreadsheetApp.getActive().getSheetByName(inputSheetName);
// 出力先のシートがなければ作ります。
let outputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(outputSheetName);
if (!outputSheet) {
outputSheet = SpreadsheetApp.getActiveSpreadsheet();
outputSheet.insertSheet(outputSheetName);
}
// SpreadSheet は I/O が早くないので、できるだけデータをまとめて get します。
var rows = inputSheet.getDataRange().getValues();
outputSheet.getRange("A1").setValue('[');
for (var itr = 0; itr < rows.length; ++itr) {
const row = rows[itr];
if (row[0] == "") {
break;
}
const item = {
num: row[0] || "",
name: row[1] || "",
type1: row[2] || "",
};
if (row[3]) {
Object.assign(item, { type2: row[3] });
}
outputSheet.getRange("A" + (itr + 2)).setValue(JSON.stringify(item) + ((itr === rows.length - 1) ? "" : ","));
}
outputSheet.getRange("A" + (rows.length + 2)).setValue(']');
}
「実行」を押します。
初回の実行時には、権限を確認されるので承認します。
実行ログが出てきて、しばらくすると完了します。
スプレッドシートに戻ると、JSON が出力されています。
2回目からは「実行」を押すだけで JSON が出力されるので、かなりお手軽だと思います。
お試しあれ(ΦωΦ)
方法④ App Script 以外でプログラムする
評価:よっぽど量がない限りは、App Script で十分
App Script は実行時間が 6分 を超えるとタイムアウトします。
また、 App Script は I/O はそんなに早くありません。
そのため、量が多く、かつ、頻繁に変換するときには仕方なく書きますが、
スプレッドシートで管理する JSON に変換したい大量データはあまりない気もします。
(せいぜい数万行ぐらいなので、出番はあまりないかも~)
おまけ:スプレッドシートに数字を書くときの注意
スプレッドシートに数字をいれると、先頭の 0 が消えてしまいます。
そんなときは数字を入れるセルの「表示形式」を変更してから入力すると、先頭の 0 が消えません。
変更してから入力しなおすと、こんな感じに先頭の 0 も書けます。