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

記事のトップ画像

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

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" },
];

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

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