2019年4月より、36(サブロク)協定で定める時間外労働に、罰則付きの上限が設けられており、人事部の人たちは月45時間の上限を超えない様にメールやスラックで残業時間が規定を超えそうな人に対してアラートを飛ばしてくれています。
ただ、そんなことのために時間を割いているのも、また36協定に引っかかってしまう原因になりかねないのでAPIとGASで都度アラートを飛ばして作業効率できればいいのにな。と思いPHPerがGASを書いてみました。
(トリガーの設定→毎日処理させる設定については別記事参照)
(slackの通知設定→「Incoming Webhook」で検索すれば詳しい記事が出てくるのでそちらを参照)
コード
gas.js
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth() + 1;
var day = now.getDate();
var company_id = 'カンパニーID設定';
var token = 'Freeeのトークン設定';
//メソッドにPOSTを指定しログイン情報を設定
var options = {
'method' : 'GET',
'headers' : {
'Authorization':'Bearer ' + token,
'accept': 'application/json'
}
};
function myFunction() {
//アクセス先URLにGETクエストを送信し、従業員一覧を抽出
var response = UrlFetchApp.fetch('https://api.freee.co.jp/hr/api/v1/companies/' + company_id + '/employees', options).getContentText();
//JSON形式に直す
var res = JSON.parse(response);
var cnt = res.length;
//従業員一人一人残業時間計算メソッドを使う
for(i = 0; i < cnt ; i++ ){
var emp_id = res[i].id;
totalTime(emp_id)
}
}
//従業員ごとの残業時間を算出
function totalTime(emp_id){
//GET先の設定
var url = 'https://api.freee.co.jp/hr/api/v1/employees/' + emp_id + '/work_record_summaries/' + year + '/' + month + '?company_id=' + company_id + '&work_records=true';
var response = UrlFetchApp.fetch(url, options).getContentText();
//JSON形式に直す
var res = JSON.parse(response);
var overtime_work_minute = 0;
//配列の数を取得
var cnt = res['work_records'].length;
for(i = 0; i < cnt ; i++ ){
var workDate = res['work_records'][i].date;
var workYear = workDate.substr( 0, 4 );
var workMonth = workDate.substr( 5, 2 );
var workDay = workDate.substr( 8, 2 );
var getDate = new Date(workYear, workMonth,workDay);
//今月か確認するif文
if(workMonth == month){
//月内のデータであれば残業時間を追加していく
overtime_work_minute += parseFloat(res['work_records'][i].total_overtime_work_mins);
}
}
overtime_work_hour = overtime_work_minute / 60;
//合計値が20時間を超えていればのif文
if(overtime_work_hour >= 40){
sentence = overtime_work_hour+ "残業時間あなたの残業時間のライフは0よ。";
postSlack(sentence)
} else if(overtime_work_hour >= 30){
sentence = "合計残業" + overtime_work_hour+ "時間。残業せず帰りましょう。";
postSlack(sentence)
} else if(overtime_work_hour >= 20){
sentence = "合計残業" + overtime_work_hour+ "時間です。36協定を忘れずに";
postSlack(sentence)
}
}
function postSlack(sentence) {
var slackPayload = {
'text' : sentence
};
var slackOptions = {
'method' : 'post',
'contentType' : 'application/json',
'payload' : JSON.stringify(slackPayload),
};
var slackUrl = 'slackのURLを貼る';
UrlFetchApp.fetch(slackUrl, slackOptions);
}
あとがき
今勤めてる会社では「Freee人事労務」ではなく「ジョブカン」を使ってますし、チャットツールは「チャットワーク」なので今回書いた記事を会社内で使うことはないんだろうな。