【GAS】 Google Apps Scriptを使って給与支払報告書を作成する(1) 〜データのMergeまで〜

image

はじめに

可茂IT塾では、インターンで働いてくれた学生にアルバイト代を払っています。年末も近づいてきましたので給与支払報告書の作成の準備をしているところです。
今回はGASを使って、給与支払報告書を作る方法について紹介したいと思います。

今回やること

名簿シートから必要なデータを取り出す

google spread sheet

  • 不要な列データ no. etc1 etc2を削除する
[ { name: '山田太郎',
    birth: 'H15.9.2',
    'postal code': '123-0001',
    address: '岐阜県' },
  { name: '渡辺みつお',
    birth: 'H13.1.18',
    'postal code': '234-0002',
    address: '愛知県' },
  { name: '小島武雄',
    birth: 'H10.7.29',
    'postal code': '345-0003',
    address: '三重県' } ]

給与支払シートから必要なデータを取り出す

google spread sheet

  • 不要な列データ etc1 etc2を削除する
  • 必要な行データ 2022年データ を取り出す
  • 同じ「氏名」で給与支払額の合計額を算出し、{ 氏名、年間給与支払額 }のデータにする
[ { name: '山田太郎', nenkanKyuyo: 80000 },
  { name: '渡辺みつお', nenkanKyuyo: 60000 },
  { name: '小島武雄', nenkanKyuyo: 20000 } ]

名簿データと年間給与データを合わせる

  [ { name: '山田太郎',
    birth: 'H15.9.2',
    'postal code': '123-0001',
    address: '岐阜県',
    nenkanKyuyo: 80000 },
  { name: '渡辺みつお',
    birth: 'H13.1.18',
    'postal code': '234-0002',
    address: '愛知県',
    nenkanKyuyo: 60000 },
  { name: '小島武雄',
    birth: 'H10.7.29',
    'postal code': '345-0003',
    address: '三重県',
    nenkanKyuyo: 20000 } ]

ここまでできるようにします

名簿オブジェクトの作成

クラス作成

はじめに、特定のシートを選択して、オブジェクトを作成するのは同一手順なのでクラス化します。

'use strict'

class DataSheet {
  constructor(ssId, shName,) {
    this.ssId = ssId;
    this.shName = shName;
    this.targetSh = SpreadsheetApp.openById(this.ssId).getSheetByName(this.shName);
    this.array = this.targetSh.getDataRange().getValues();
  }

  toObj() {
    // オブジェクトにする
    const [header, ...records] = this.array;  //1行目がヘッダー、以降がレコード
    const objects = records.map(
      record => record.reduce((acc, value, index) => {
        acc[header[index]] = value;
        return acc;
      }, {})
    );
    return objects;
  }
}

参考:[GAS]二次元配列からオブジェクト/MAPオブジェクトに変換する (MapとReduceで)

これにより次のコードで名簿シートのオブジェクト取得することができます

const memberSh = new DataSheet('1Z******************DU', '名簿'); // シートID,シート名
const memberObj = memberSh.toObj();

データの整形

不要な列データを削除します

const deleteKeyMember = ['no.','etc1', 'etc2',] // 不要な列項目

memberObj
  .map((key) => {
    for (const element of deleteKeyMember) {
      delete key[element]; // 不必要な列データを削除する
    }
  })

年間給与オブジェクトの作成

  • オブジェクト作成
const kyuyoShiharaiSh = new DataSheet('1Z******************DU', '給与支払');
var kyuyoShiharaiObj = kyuyoShiharaiSh.toObj();
  • 給与支払年が2022年であるデータを抽出する
var filteredkyuyoShiharaiObj = kyuyoShiharaiObj.filter(data => data['yearMonth'].includes('2022'));
  • 氏名が同一の給与を足していき、 {氏名,年間給与} のオブジェクトにする
var nenkanKyuyoObj = [...
    filteredkyuyoShiharaiObj.reduce(
      (m, item) => m.set(item.name, (m.get(item.name) || 0) + item.kyuyo)
      , new Map()
    )].map(([name, nenkanKyuyo]) => ({ name, nenkanKyuyo }));

参考:連想配列からカテゴリごとの小計を求める方法

名簿オブジェクトと年間給与オブジェクトを名前でマージする

  • Object.assign(obj_a, obj_b)で、オブジェクトをマージすることができます
  • mapメソッドで2つのオブジェクトを回して、同じ氏名のオブジェクトをマージします
// データをmergeする
let kyuyoHoukokuObj = [];
nenkanKyuyoObj.map((element) => {
  memberObj.map((member) => {
    if (element.name === member.name) { //名前が一緒のobjctをmergeする
      Object.assign(member, element);
      kyuyoHoukokuObj.push(member);
    }
  })
});

参考:JavaScriptでオブジェクトをマージ(結合)する方法
これで以下のデータの完成です

[ { name: '山田太郎',
   birth: 'H15.9.2',
   'postal code': '123-0001',
   address: '岐阜県',
   nenkanKyuyo: 80000 },
 { name: '渡辺みつお',
   birth: 'H13.1.18',
   'postal code': '234-0002',
   address: '愛知県',
   nenkanKyuyo: 60000 },
 { name: '小島武雄',
   birth: 'H10.7.29',
   'postal code': '345-0003',
   address: '三重県',
   nenkanKyuyo: 20000 } ]

まとめ

名簿オブジェクトと年間給与オブジェクトを合わせること(merge)ができました。
実際の給与支払報告書には他にもいろいろ入力するデータがあるかと思いますが、今回紹介したコードを参考に不要な項目を削除したり、データの抽出をして最後にマージをすれば好みのデータを作成できるのではないかと思っています。
入力データを作成することができたので、次回は給与支払報告書のスプレッドシートに今回作成したデータを入力して、それをPDF化して保存するまでを紹介したいと思います。

お知らせ

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

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

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

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

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

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

Read More

タグ

Flutter (112)初心者向け (28)イベント (18)Google Apps Script (15)Nextjs (12)可茂IT塾 (9)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)ヒーター (1)作業効率 (1) (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)VRChat (1)API (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)FlutterFlow (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