GAS(Google App Script) + Slackで勤怠管理(タイムカード)作ってみた

最終更新日

Slackでタイムカード

GAS(Google App Script) + Slackで勤怠管理(簡易タイムカード)作ってみた


うちのようなドベンチャーには、勤怠管理システムがない。
よくある1人100円から使える勤怠管理システムというものがあるが、弊社ではまだ導入はしていない。

ということで、プライベートワークで、SlackとGASを使った「簡易タイムカードシステム」を作ってみた。
大した機能はなくて、正直ちゃんとしてないです。
タイムカードでお困りの方はとりあえずでよければログとして残せます。

■作ったモノ

Slackの#Kintaiチャンネルで”出勤”/”退勤”と入力すると、その入力した時間がGoogleSpreadシートに名前と時間と出勤/退勤というステータスが保存されます。
弊社では、入国/出国にしました。

■必要なモノ

  1. Slack
  2. Slack プラグイン(Outgoing Webhooks)
  3. Google SpreadSheet

■流れ

  1. 勤怠用のSlackチャンネルを作る #kintai
  2. 勤怠管理用のGoogle SpreadSheetを作る
  3. SlackのACCESS TOKENを手に入れる
  4. SlackのCustom Integrations > Outgoing WebHooks を入れる
  5. Outgoing WebHooksのIntegration Settingsで以下の設定をする
    1. 反応するChannelを指定する #kintai
    2. 反応する文字列を指定する / Trigger Word(s)の設定 (出勤 / 退勤)
    3. Google スプレッドシートのURLを記載する
    4. Outgoing WebHooksのTOKENをメモしておく
    5. SAVEする
  6. Google SpreadSheetのスクリプトを作成
    1. ツール > スクリプトエディタの立ち上げ
    2. リソース > ライブラリを選択
      1. ライブラリを追加のテキストボックスに以下を入力
      2. M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
    3. 下記のスクリプトを記載
    4. ファイル > 版を管理を選択
      1. 新しいバージョンを保存を選択
    5. 公開 > ウェブアプリケーションとして導入を選択
      1. プロジェクトバージョンを最新にする
      2. 自分でアプリケーションを実行するを選択
      3. アプリケーションにアクセスできるユーザーは、全員(匿名ユーザーを含む)を選択
  7. Slackでコマンドを入力
  8. 完成

スクリプト

//Slackのアクセストークン
SLACK_ACCESS_TOKEN = “Slackの設定ページから取得する”;

//出勤/退勤/時間をspledsheetに残す
function checkDate(){
//日付を取得
var d = new Date();

//今日の日付のデータを取得する(ddを使いシートの日付を取得)
var daily = Utilities.formatDate(d,”JST”,”dd”);
//もし頭に0がついてしまう場合0は消す
daily = Number(daily);
//月を取得
var month = Utilities.formatDate(d,”JST”,”MM”);

//曜日
//日曜が0、土曜日が6。配列を使い曜日に変換する。
dateT = [“日”,”月”,”火”,”水”,”木”,”金”,”土”];
var day = dateT[d.getDay()];
//時
var hours = (“0″+d.getHours()).slice(-2);
//分
var minutes = (“0″+d.getMinutes()).slice(-2);
//時間を連結してテキストで渡す
var DateTime = month + “月” + daily + “日(” + day + “) ” + hours + “:” + minutes;
return(DateTime);
}

//Outgoing WebHooksを利用して、投稿に反応させる
//Slackのkintaiチャンネルで入力したワードがこのイベントに入ってくる
function doPost(e) {
var token = PropertiesService.getScriptProperties().getProperty(‘SLACK_ACCESS_TOKEN’);
var bot_name = “ボット名”;
var bot_icon = “アイコン画像のパス”;
var verify_token = “Outgoing WebHooksのTOKENをここにコピペ”;
var post_text = e.parameter.text;
var date_time;
var state; //出勤か退勤か
var error_text = “”;

//投稿の認証
if (verify_token != e.parameter.token) {
throw new Error(“invalid token.”);
}
var app = SlackApp.create(token);

//時間の取得
date_time = checkDate();

var num = Math.floor(Math.random()*5+1 );

if ( post_text.indexOf(‘入国’) != -1) {
state = 1;
switch(num)
{
case 1:
var text = “おはようモグー!\n今日も1日頑張ろうモグ!”;
break;

case 2:
var text = “今日もいい日でありますようにモグ”;
break;

case 3:
var text = “モグモグモグ!モグー”;
break;

case 4:
var text = “おはようモグー!”;
break;

case 5:
var text = “今日も子どもたちのみらいを想像して頑張ろうモグ”;
break;

case 6:
var text = “モグーのすきなものは焼き芋モグ!”;
break;
}
}

if ( post_text.indexOf(‘出国’) != -1) {
state = 2;
switch(num)
{
case 1:
var text = “お疲れモグー!\n今日も1日ご苦労さんモグ!\n明日もいい日にするモグよ!”;
break;

case 2:
var text = “ご苦労さんです。by中の人”;
break;

case 3:
var text = “ありがとうモグ!”;
break;

case 4:
var text = “気を付けて帰ってモグね!家に着くまでが冒険だよ!”;
break;

case 5:
var text = “お疲れさまモグ!今日の頑張りが必ず明日の為になってるモグよ!”;
break;

case 6:
var text = “今日はどうだったモグか?お疲れ様モグ!”;
break;
}

}

//勤怠システムに書き込む
if(state != 0)
{
//時間の取得(上の方で記載した関数)
var date_time = checkDate();

var postdata = {
dt: date_time, //時間
userName: e.parameter.user_name, //ユーザー
state: state
};

//書き込む
var result = getAttendance(postdata);
if(result != 1)
{
error_text = “\n正しくスプレッドシートに記載できなかったみたいモグ”;
}else{
error_text = “”;
}
}

//ボットからのコメント
var message = e.parameter.user_name + “、” + text + error_text;
return app.postMessage(e.parameter.channel_id, message, {
username: bot_name,
icon_url: bot_icon
});
}

//スプレに記載
function getAttendance(e){
var ss = SpreadsheetApp.openByUrl(‘スプレッドシートのURL’);
var sheet = ss.getSheets()[0];

//最終列の取得
var lastRow = sheet.getLastRow();
var id = lastRow;
//時間
var entrytime = e.dt
//ユーザー名
var name = e.userName;
//出勤か退勤か
var state = e.state;
var isError;

if(state == 1){state = “出勤”;}
if(state == 2){state = “退勤”;}
if(state == 0){isError = true;}

if(!isError)
{
// データ入力
sheet.appendRow([id, name, entrytime, state]);
return (1);
}else{
return (2);
}

}

以上で完成です!