気づいたらGoogle Apps Script(GAS)でV8ランタイムが利用できるようになっていました。
- V8 Runtime Overview | Apps Script | Google Developers
- GASがV8エンジンに対応したのでドキュメント読んだ
- 祝!Google Apps Scriptが「V8ランタイム」をサポート!モダンなECMAScript構文が使えるようになった
公式ドキュメントにもハッキリ書いてあり、日本語の記事もたくさんあります。
何が嬉しいかって言うと、いままで太古の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関数や内部関数をアロー関数でサクッと定義できるのは助かります。
GASで定義した関数はこんな感じで使えます。