LoginSignup
1
1

More than 3 years have passed since last update.

V8ランタイムのGoogle Apps Script(GAS)で、JSON文字列をparseして特定のフィールドを取り出す関数を書く

Last updated at Posted at 2020-03-24

気づいたらGoogle Apps Script(GAS)でV8ランタイムが利用できるようになっていました。

公式ドキュメントにもハッキリ書いてあり、日本語の記事もたくさんあります。

何が嬉しいかって言うと、いままで太古のJavaScriptの構文しか使えなかったGASでアロー関数やclassや分割代入が使えるようになったのです。ReactやVue.jsなどでこういった新しい構文にどっぷり浸かった状態でGASに来ると「あれもダメこれもダメ」と言われまくるストレスから開放されるのです。最高です。

本題

今回はGASでモダンなECMAScript構文を使いつつ、JSON文字列をparseして特定のフィールドを取り出すGoogleスプレッドシート用の関数を書いてみます。
といっても、「アロー関数を使えるからスッキリ書けた」ってだけです。

GoogleスプレッドシートならJSONをparseする関数くらい用意されているかなと思いましたが、案外なかったので備忘録として残しておきます。

「Google Apps Scriptってなんぞ」や、GoogleスプレッドシートでGoogle Apps Scriptを利用できる方法についてはこの記事で解説しません。検索したらたくさん出てくると思います。

手順

このようなJSON文字列から、nameというフィールドの値を取り出します。

json_string
{"name": "Apple"}
{"name": "Banana"}
{"name": "Coffee"}

セルを一つ受け取ってparseしてnameを返すだけならこう書けますね。parseが失敗することも考慮して、try catchも挟みます。

function extractNameFromJSON(cell) {
  let obj;
  try {
    obj = JSON.parse(cell);
  } catch(e) {
    console.error(e);
    return null;
  }
  return obj.name;
}

cellにはこのような文字列が入ってくるので、JSON.parse関数でparseしてnameを取り出しているだけです。

"{ \"name\": \"Apple\" }"

また、配列関数としても使えるように、範囲で入力を受け取っても対応できるようにします。
範囲を関数の入力としたときは、以下のような値を処理することになります。

[["{ \"name\": \"Apple\" }"], ["{ \"name\": \"Banana\" }"], ["{ \"name\": \"Coffee\" }"]]

行×列の二次元配列です。これも処理できるように調整した関数がこちらです。

function extractNameFromJSON(range) {
  const parse = (jsonString) => {
    let obj;
    try{
      obj = JSON.parse(jsonString);
    } catch(e) {
      console.error(e);
      return null;
    }
    return obj.name;
  };

  if (Array.isArray(range)) {
    return range.map(row => row.map(cell => parse(cell)));
  } else {
    return parse(range);
  }
}

配列かどうかを確認して、配列だったらその中から行に相当する配列を取り出し、その中からJSON文字列を取り出してparseします。同じ構造の配列で返せばGoogleスプレッドシート側では結果を範囲として扱ってくれるので、map関数を利用します。

配列ではなかったらmap関数を使わずにそのままparseして結果を返します。同じ処理が重複しないよう、内部でparse関数を定義しています。

map関数や内部関数をアロー関数でサクッと定義できるのは助かります。

image.png

GASで定義した関数はこんな感じで使えます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1