Ribbit.work

【GAS】スプレッドシートからJSONへの変換を短く安全に記述する方法

Google Apps Scriptjavascript

last modified date2021-6-30

publish date2021-6-23

こんにちはリビットです。

Google Apps Script(以下GAS)はほぼほぼJavaScriptと同じ仕様ですが、JavaScriptはECMAScriptという規格に基づいて定期的に改定が行われています。

そしてGASについても、この改定によって更新された機能のほとんどすべてを使用することができます。

もうすでにスプレッドシートのデータをJSONに変換する方法を説明した良い記事がたくさんあるのは知っていましたが、せっかく書けるのに使わないのはもったいないなーと思っていたので、今回はモダンな記述方法を使った方法を紹介します。

ただ記述方法が新しいだけでなく、データを全てイミュータブルに取り扱っているので安全性も高いと思います。

コード

まず今回のコード全文をご覧ください。

/**
 * @param {string} id
 * @param {string} sheetName
 * @return {Record<string, string>[]}
 */
const getJson = (id, sheetName) => {
  const sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
  const arrays = sheet.getDataRange().getValues();

  const [header, ...rows] = arrays;

  return rows.map((row) =>
    row.reduce((acc, cell, i) => ({ ...acc, [header[i]]: cell }), {})
  );
};

主に使っているのは分割代入Array.prototype.map, Array.prototype.reduceです。

また、GASの新しいエディタでは、定められたフォーマットで関数にコメントをつけると型情報を補完してくれる機能があります。 これによって、この関数からの返値はオブジェクトの配列であることを伝えることができます。

分割代入について補足

全文のうち、以下の部分について補足します。

const [header, ...rows] = arrays;

このコードで、「変数arraysの1行目と残り全て」をそれぞれ変数に格納しています。

arrays.splice(0, 1)のような分割方法でも実現することはできますが、この方法ではarraysの値を直接書き換えてしまうため、もしarraysを別の場所でも使用していた場合、一貫性が保てないため不具合の原因になりえます。

テスト

試しにヘッダー行と4×4のデータが入ったスプレッドシートを指定して実行してみました。

[
  { 項目1: "1-1", 項目2: "1-2", 項目3: "1-3", 項目4: "1-4" },
  { 項目1: "2-1", 項目2: "2-2", 項目3: "2-3", 項目4: "2-4" },
  { 項目1: "3-1", 項目2: "3-2", 項目3: "3-3", 項目4: "3-4" },
  { 項目1: "4-1", 項目2: "4-2", 項目3: "4-3", 項目4: "4-4" },
];

今回使った方法はスプレッドシートのデータを取り扱う上でとても使い勝手が良いと思いますので、よろしければご活用ください。

最後まで読んでいただきありがとうございました。

この記事をシェア

この記事を読んだ方におすすめの記事

 【GAS】スレッドに引っ張られて、不要なメールまで取得してしまう場合の対処法
2021-8-11

【GAS】スレッドに引っ張られて、不要なメールまで取得してしまう場合の対処法

Google Apps Script
【GoogleAppsScript】Gmailから特定のメールを取得する
2021-8-11

【GoogleAppsScript】Gmailから特定のメールを取得する

Google Apps Script
スプレッド構文とconcat、どちらを使うべきか【javascript】
2021-8-11

スプレッド構文とconcat、どちらを使うべきか【javascript】

javascript
ダブルクォートの有無や文字コードを問わず使用できるCSV取込
2021-7-19

ダブルクォートの有無や文字コードを問わず使用できるCSV取込

javascript

最新の記事

kuromoji.jsで形態素解析
2021-12-4

kuromoji.jsで形態素解析

TypeScriptJavaScript
レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】
2021-12-4

レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】

JavaScriptKintone
レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】
2021-11-29

レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】

JavaScriptKintone
スライダーを使って数値を設定できるKintoneプラグイン【無料公開】
2021-11-26

スライダーを使って数値を設定できるKintoneプラグイン【無料公開】

KintoneJavaScriptTypeScript