Google スプレッドシートを JSON 形式に変換する方法(サンプルコード付)[2022年版]

2022-09-16

プログラムではデータを 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 も書けます。