可茂IT塾では、インターンで働いてくれた学生にアルバイト代を払っています。年末も近づいてきましたので給与支払報告書の作成の準備をしているところです。
今回はGASを使って、給与支払報告書を作る方法について紹介したいと思います。
[ { 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: '三重県' } ]
[ { 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();
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)
で、オブジェクトをマージすることができます// データを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塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More