GAS: スプレッドシートの表をオブジェクトの配列にする

スプレッドシート + Google Apps Scriptでアプリやツールを作る時、ある程度処理が複雑になってくると、データをオブジェクトで扱いたくなったりします。

参考までに、私がよく使うコードを紹介します。

取得対象のスプレッドシートの表
function sample() {
  // シート内の表を二次元配列で取得する
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('シート名');
  const arrays = sheet.getDataRange().getValues();

  // 二次元配列 → オブジェクトの配列
  const objects = arraysToObjects(arrays);
  console.log(objects);
}

/**
 * 二次元配列からオブジェクトの配列を作成する
 */
function arraysToObjects(arrays) {
  const [keys, ...records] = arrays;
  return records.map(record => 
    record.reduce((acc, value, i) => {
      acc[keys[i]] = value;
      return acc;
    }, {})
  );
}

実行結果( console.log(objects)の出力 )は下記のとおりです。

[ { name: '神田 庸司',
    kana: 'カンダ ヨウジ',
    position: '役員',
    gender: '男',
    blood_type: 'B',
    date_of_birth: '1973/08/30',
    phone_number: '0855-88-0943',
    email: 'kanda1973@sannet.ne.jp' },
  { name: '米田 麻琴',
    kana: 'マイタ マコト',
    position: '部長',
    gender: '女',

    // ... 省略 ... //

    phone_number: '03-3062-6202',
    email: 'hiroyaayorih@sannet.ne.jp' } ]

この方法には以下のようなメリットがあります。

  • マジックナンバーをなくして可読性アップ
    例えば、3人目のメールアドレスを取得する時、配列のままだとemployees[2][7]のようになりますが、オブジェクトにすればemployees[2].emailのようにできます。
  • 列順を変えてもコードの修正が必要ない
    配列のままだと、列の順番が変わるたびに、添え字を変更する必要がありますが、オブジェクトであればコード変更の必要がありません。

とにかくコードが読みやすくなるのでおすすめです。

おまけ:セルに配列やオブジェクトが入っている場合

たまにですが、私は、セルに配列オブジェクトをJSON化して記録しておくことがあります。

こんな感じでセルに入れることがあります。

その場合は、オブジェクトの配列を作成する関数を少し修正します。

/**
 * 二次元配列からオブジェクトの配列を作成する
 */
function arraysToObjects(array) {
  const [keys, ...records] = array;
  return records.map(record => 
    record.reduce((acc, value, i) => {
      value.match(/^\[.*\]$/) || value.match(/^\{.*\}$/)
        ? acc[keys[i]] = JSON.parse(value)
        : acc[keys[i]] = value
      return acc;
    }, {})
  );
}

matchメソッドで、 [ で始まり ] で終わる、または、 { で始まり } で終わる文字列だった場合に、JSON.parseすることで、文字列ではなく配列またはオブジェクトにしています。

コメント