給与計算をGoogleスプレッドシートとGoogle Apps Script で!
こんにちは。制作担当のユースケです。
いきなりですが、みなさん給与計算ってどうしてますか?
小規模店舗だと専用アプリ入れるのも大げさですよね。
かといって、全部手作業なんて時間ばかり取られて大変です。
そこで【Googleスプレッドシート】と【Google Apps Script】を使って、
自動化しましょうというのが今日のお題です!
(※Google Apps Script(以下GAS)はJavaScriptで操作するスクリプト環境です。)
Google スプレッドシート
Google Apps Script
Excelでいいじゃんという声もあるかもしれませんが、ファイル共有とか考えると現実的じゃないかなということで
Web上で簡単に共有できるGoogleサービスを採用です!無料ですし。
計算ルールは以下のとおり。
■ 基本給は900円
■ 朝9時までは1000円
■ 夜22時以降は1125円
■ 8時間以上の勤務は1125円
まずは、スプレッドシートのデータを取得しましょう。
// Activeなシートを取得 var sheet = SpreadsheetApp.getActiveSheet(); // データが入力されている範囲を取得 var rows = sheet.getDataRange(); // 取得範囲の行数を取得 var numRows = rows.getNumRows(); // 取得範囲のデータを配列で取得 var vals = rows.getValues();
取得したデータは、行ごとのデータをまとめた多次元配列なので
行位置を指定することで各行の値を操作できます。
今回は勤務時間の入力開始位置からループさせて処理します。
for (var i= 7; i <= numRows -1; i++) {
var st, ed, re;
try {
var row = vals[i];
st = row[2]; // 始業時刻
ed = row[3]; // 終業時刻
re = row[4]; // 休憩時間
// 結果の出力位置を取得
if (row[6].indexOf("通常時間") >= 0) sr = i + 1;
// 始業時刻が空の場合、次行へ
if (st == "") continue;
var st_h = st.getHours();
var st_m = st.getMinutes();
var ed_h = ed.getHours();
var ed_m = ed.getMinutes();
var t1 = st_h * 60 + st_m;
var t2 = ed_h * 60 + ed_m;
} catch (e) {
Browser.msgBox(i + "行目にエラーがあります");
break;
}
}
ループ内で「始業時刻」と「終業時刻」を取得し、分単位に変換しています。
「始業時刻」と「終業時刻」から勤務時間を算出します。
「休憩時間」を控除したのち、時給金額に応じた時間帯ごとに勤務時間を算出します。
var min0 = t2 - t1; // 勤務時間
// 休憩時間を控除
if (re != "") {
var re_h = re.getHours();
var re_m = re.getMinutes();
var t3 = re_h * 60 + re_m;
min0 -= t3;
}
// 深夜時間を算出
var tN = LATE_NIGHT * 60;
if (tN < t2) {
min0 -= (t2 - tN);
min3 += (t2 - tN);
}
// 8時間超過分を算出
if (min0 > 480) {
min4 += (min0 - 480);
min0 = 480;
}
// 早朝時間を算出
var tM = EARLY_MOR * 60;
if (tM > t1) {
if (tM > t2) tM = t2;
min0 -= (tM - t1);
min2 += (tM - t1);
}
min1 += min0;
ループ内で集計した各時間をもとに給与を計算し、
勤務時間と給与をスプレッドシートへ出力します。
// スプレッドシートへの書き込み
var setVal = function (name, value) {
sheet.getRange(name).setValue(value);
}
// 分単位を「h:m」表記に変換
var m2h = function (min) {
var h = Math.floor(min / 60);
var m = min % 60;
return h + ":" + ("0" + m).slice(-2);
}
// 勤務時間を出力
var min_all = min1 + min2 + min3 + min4;
setVal("I"+sr, m2h(min1)); // 通常
setVal("I"+(sr+1), m2h(min2)); // 早朝
setVal("I"+(sr+2), m2h(min3+min4)); // 深夜+超過
setVal("I"+(sr+3), m2h(min_all)); // 総計
// 給与を出力
var s1 = (PAY_1 / 60) * min1;
var s2 = (PAY_2 / 60) * min2;
var s3 = (PAY_3 / 60) * (min3 + min4);
var s0 = Math.ceil(s1 + s2 + s3);
setVal("J"+sr, s1);
setVal("J"+(sr+1), s2);
setVal("J"+(sr+2), s3);
setVal("J"+(sr+3), s0);
};
最後に作った関数を実行するトリガーを実装します。
今回はメニューに追加してみました。
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "計算実行",
functionName : "calc"
}];
sheet.addMenu("給与計算", entries);
};
ということで、纏めると下記のようになります。
var PAY_1 = 900; // 通常
var PAY_2 = 1000; // 早朝
var PAY_3 = 1125; // 深夜
var PAY_4 = 1125; // 8時間以上勤務
var EARLY_MOR = 9; // 早朝時給の終了時間
var LATE_NIGHT = 22; // 深夜時給の開始時間
function calc() {
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var vals = rows.getValues();
var sr = 0;
var min1 = 0; // 通常
var min2 = 0; // 早朝
var min3 = 0; // 深夜
var min4 = 0; // 8時間以上勤務
for (var i= 7; i <= numRows -1; i++) {
var st, ed, re;
try {
var row = vals[i];
st = row[2]; // 始業時刻
ed = row[3]; // 終業時刻
re = row[4]; // 休憩時間
// 結果の出力位置を取得
if (row[6].indexOf("通常時間") >= 0) sr = i + 1;
// 始業時刻が空の場合、次行へ
if (st == "") continue;
var st_h = st.getHours();
var st_m = st.getMinutes();
var ed_h = ed.getHours();
var ed_m = ed.getMinutes();
var t1 = st_h * 60 + st_m;
var t2 = ed_h * 60 + ed_m;
} catch (e) {
Browser.msgBox(i + "行目にエラーがあります");
break;
}
var min0 = t2 - t1;
// 休憩時間を控除
if (re != "") {
var re_h = re.getHours();
var re_m = re.getMinutes();
var t3 = re_h * 60 + re_m;
min0 -= t3;
}
// 深夜時間を算出
var tN = LATE_NIGHT * 60;
if (tN < t2) {
min0 -= (t2 - tN);
min3 += (t2 - tN);
}
// 8時間超過分を算出
if (min0 > 480) {
min4 += (min0 - 480);
min0 = 480;
}
// 早朝時間を算出
var tM = EARLY_MOR * 60;
if (tM > t1) {
if (tM > t2) tM = t2;
min0 -= (tM - t1);
min2 += (tM - t1);
}
min1 += min0;
}
var setVal = function (name, value) {
sheet.getRange(name).setValue(value);
}
var m2h = function (min) {
var h = Math.floor(min / 60);
var m = min % 60;
return h + ":" + ("0" + m).slice(-2);
}
var min_all = min1 + min2 + min3 + min4;
setVal("I"+sr, m2h(min1)); // 通常
setVal("I"+(sr+1), m2h(min2)); // 早朝
setVal("I"+(sr+2), m2h(min3+min4)); // 深夜+超過
setVal("I"+(sr+3), m2h(min_all)); // 総計
var s1 = (PAY_1 / 60) * min1;
var s2 = (PAY_2 / 60) * min2;
var s3 = (PAY_3 / 60) * (min3 + min4);
var s0 = Math.ceil(s1 + s2 + s3);
setVal("J"+sr, s1);
setVal("J"+(sr+1), s2);
setVal("J"+(sr+2), s3);
setVal("J"+(sr+3), s0);
};
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "計算実行",
functionName : "calc"
}];
sheet.addMenu("給与計算", entries);
};
いかがでしたでしょうか。
GASを使えば、Googleスプレッドシートもワンランク上の使い方ができます。
しかもGASはスプレッドシート専用ではなく、Googleの他のサービスでも使えるので
是非いろいろ試してみてください。
イイ使い方があったら、こっそり教えてくださいね。(笑)