【GAS】 spreadSheetのデータを扱いやすいオブジェクトに変換する

image

はじめに

GASでは、spreadSheetにあるデータを取得して、オブジェクトに変換し、加工するという処理を頻繁に行います。その際に便利なクラスを紹介します。

どのようなオブジェクトがいいか

配列の中に、連想配列を入れるというオブジェクトが一番コードの可読性もよく、順番も保証されて扱いやすいと思います。そこで次のようなクラスを作りました。

class DataSheet {

  constructor(ssId, shName, columnNumber, lastColumn) {
    // sheetオブジェクトの取得
    this.ssId = ssId;
    this.shName = shName;
    this.targetSh = SpreadsheetApp.openById(this.ssId).getSheetByName(this.shName);
    
    // 範囲の指定 ,valuesの取得
    this.columnNumber = columnNumber; // 最終行を判定する列番号の指定
    this.lastColumn = lastColumn; // 最終列番号の指定
    this.lastRow = this.targetSh.getRange(this.targetSh.getMaxRows(), this.columnNumber).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); // 特定列の最終行を取得(最下段から検索)
    this.values = this.targetSh.getRange(1, 1, this.lastRow, this.lastColumn).getValues();
  }

  toArrayObj() {
    // arrayオブジェクトにする
    const array = [];
    const [header, ...records] = this.values;
    const map = records.map(
      record => record.reduce((acc, value, index) => acc.set(header[index], value), new Map())
    );
    map.map((key) => {
      let obj = Object.fromEntries(key.entries());
      array.push(obj);
    });
    return array;
  }
}

使い方

以下のようなシートがあったとします。
GAS

次にようにクラスをインスタンスし、toArrayObj()を実行します。

// datasheet
  const sheet = new DataSheet(シートID, シートの名前, lastRowを判定する列番号, 取得する範囲の最終列番号);
  const obj = sheet.toArrayObj();
  console.log(obj);

すると次のようなオブジェクトが取得できます。

[ { '氏名': '佐藤太郎', '年齢': 30, '住所': '東京都新宿区', '身長': 175, '体重': 70 },
  { '氏名': '鈴木花子', '年齢': 25, '住所': '大阪府大阪市', '身長': 160, '体重': 55 },
  { '氏名': '高橋一郎', '年齢': 40, '住所': '北海道札幌市', '身長': 180, '体重': 80 } ]

このオブジェクトを使って、条件分岐、データの加工などを行うことができます。

// for文で回してみます。
for (const [index, data] of Object.entries(obj)) {
    if (data["年齢"] >= 30) {
      console.log(`${index}_${data["氏名"]}さんは30歳以上です。`);
    }else{
      console.log(`${index}_${data["氏名"]}さんは30歳未満です。`);
    }
    let BMI = data["体重"]/(data["身長"]/100)/(data["身長"]/100);
    console.log(`${index}_${data["氏名"]}さんのBMIは${BMI}です`)
  }

以下のような結果が得られます。

16:45:51    情報  0_佐藤太郎さんは30歳以上です。
16:45:51    情報  0_佐藤太郎さんのBMI22.857142857142858です
16:45:51    情報  1_鈴木花子さんは30歳未満です。
16:45:51    情報  1_鈴木花子さんのBMI21.484375です
16:45:51    情報  2_高橋一郎さんは30歳以上です。
16:45:51    情報  2_高橋一郎さんのBMI24.691358024691358です
16:45:52    お知らせ    実行完了

まとめ

以上、GASでspreadSheetのデータを扱いやすいオブジェクトに変換するクラスを紹介しました。
参考になれば幸いです。

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (110)初心者向け (28)イベント (18)Google Apps Script (15)Nextjs (12)可茂IT塾 (8)Firebase (7)riverpod (6)React (6)ChatGPT (5)vscode (5)デザイン (5)新卒 (4)就活 (4)Figma (4)Dart (4)JavaScript (4)お知らせ (4)FlutterWeb (3)Prisma (3)NestJS (3)Slack (3)TypeScript (3)ワーケーション (3)インターン (3)設計 (2)線型計画法 (2)事例 (2)Git (2)Image (2)File (2)Material Design (2)画像 (2)iOS (2)アプリ開発 (2)React Hooks (2)tailwindcss (2)社会人 (2)大学生 (2)RSS (1)Google (1)Web (1)CodeRunner (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)パワーポイント (1)趣味 (1)モンスターボール (1)CSS (1)SCSS (1)Cupertino (1)ListView (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)コード生成 (1)GitHub Copilot (1)オンラインオフィス (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)Freezed (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)経験談 (1)フリーランス (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)getAuth (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More