출근 체크의 모든 기록

Gomi_kery·2022년 11월 13일
0
post-thumbnail

발단

현재 다니고 있는 회사는 9시간 근무 후 칼같은 정시퇴근이 가능하다.

출근 시에는 지문을 찍지만 정작 시간은 우리가 볼 수 없다는 게 단점.
그래서 사람들은 별도로 시간을 기록하는데 까먹으면
늦게? 퇴근하게 되는 일이 다반사다.
...

11월 11일, 오늘도 일정이 밀렸다.
그전까지 출근 시간 기록을 아이폰 shotcut 으로 타이머 9시간 버튼을
만들어서 활용했으나, 핸드폰을 껐다켜거나
실수로 일시정지 버튼을 누르면 안되기에 타이머를 2개 돌리는
번거로움이 있었다. 심지어 버튼을 2번 눌러서 시간이 초기화되는 일도 있었다.

자주 사용하는 구글 시트에 기록하는 시트를 만들자!

Phase 1

버전 1.

원래의 목표

  1. [출근 체크] 버튼과 날짜별 출근/퇴근시간이 기록되는 표
  2. 버튼을 누르면 현재 시간이 체크되고 아래 셀로 이동.

google app script로 버튼을 선택했을 때

  • 현재 선택(활성화)된 셀에 현재 시간이 입력되는 기능과
var cell = SpreadsheetApp.getActive();
var day = new Date(); 
var time = day.toLocaleTimeString();

cell.setValue(time);

구글 시트 함수에 if문을 사용하여

  • 시간이 입력되면 DATE에 오늘 날짜가,

    = if({셀 주소} = "","", TODAY())
    
    // 시간 미입력 : "공백"
    // 시간 입력 : 입력된 날짜
  • 기록된 시간을 기준으로 퇴근 시간이 계산

    = if({셀 주소}="","◀ 선택",{셀 주소}+time(9,0,0))
    
    // 시간 미입력 : ◀ 선택 노출
    // 시간 입력 : 기록된 시간 + 9H 

    되는 것을 구현했고
    이 상태에서 팀 동료분에게 공유했다.

"이런 걸 만들었어요. 어때요?"

피드백

  • 의도는 알겠는데, 조금 소름 돋네요.
    이거 회사에서 근태 감시용으로 쓰라고 할 수 있을 것 같아요.

  • 잘못해서 다 지워버릴 수 있을 거 같아요.
    보호 설정해도 나는 바꿀 수 있잖아요
    버튼 외에 사용자가 수정을 할 수 없었으면 좋을 것 같아요.

퇴근

버튼 선택 시, 고정된 셀에 데이터가 입력되도록 하는 기능까지 만들고

var cell = SpreadsheetApp.getActive().getRange('셀 주소');

cell.setValue(currentTime);

데이터 입력된 후에 다음 줄로 이동하는 기능을 고민하다가 퇴근했다.

옆에서 이 모든 과정을 보던 개발자 분께서는
실은 다음줄로 이동하는 기능에 대해 조언을 주셨지만 내가 이해하지 못했다.

개 : 주말에도 집에 가서 이거 하겠네요?
나 : 주말엔 게임해야죠!!! 무쓴 소리!


Phase 2

버전 2.

하지만 퇴근 후
집에 와서 게임을 하면서도 계속 생각이 났다.

아 쪼끔만 손대면 끝낼 수 있을 것 같은데....

피드백의 반영

  • 아래쪽에 있었던 표를 삭제했고, 버튼 뒤에 시간 기록.
  • 별도의 구글 계정으로 문서를 생성, 시트 보호 권한 설정 후
    시간이 기록되는 셀에만 문서 수정 예외처리.
  • 기록된 시간, 날짜, 퇴근시간의 데이터를 하나의 행에 담고 행 숨기기 처리.

    솔직히 이 시점에서 나말고 누가, 얼마나 쓸지 모르는데 오바인가?
    하는 생각이 들었지만
    소스 구글링, 나한테 맞게 수정하고 그리고 의도한 대로 동작하는 게 너무 재미있어서 그만둘 수 없었다는 후문...

기능 추가

  • 행 숨기기 해제 > 셀 선택 > 시간 삭제 과정이 번거로워 [초기화] 버튼 추가
function Clear() {
  var spreadsheet = SpreadsheetApp.getActive().getRange('셀 주소');
  spreadsheet.clearContent();
}
  • 시간 미입력 시, "오늘" / 입력 시 {입력한 날짜} 표시
=if({셀 주소}="","오늘",if(not({셀 주소}=""),TODAY(),E3))
  • [출근 체크] 선택 시, 시간 입력 메세지 박스 노출
 Browser.msgBox('메세지 타이틀','메세지 내용',Browser.Buttons.OK_CANCEL)

자체 피드백

원했던 기능이 다 들어간 것 같았다.

다만, 버튼 선택 > 메세지 박스에 [취소], [X] 버튼을 선택해도

버튼을 클릭한 시점의 시간이 계속 기록되는 부분이 아쉬웠다

구글링을 활용하여 if 문을 사용해서,
해당 셀이 공백 일때 시간 기록이 되지 않도록 해봤지만
else일 때만 동작이 되었다.

if(cell == ""|| cell == 0) {
	Browser.msgBox( ~~...
}
else {
	Browser.msgBox( ~~
}

벌써 토요일 새벽 2시, 모르겠다... 자자...


Phase 3

버전 3.

기능 추가

생각해보니 모두가 9시간 근무를 하는 것은 아니다.
오전/오후 반차 사용이 가능했고 반차는 4시간만 근무하면 된다.

우선 간단하게? 기존 함수에 -4H 를 적용해서 반차를 계산하게 만들었다.

'종일'과 '반차'를 한 화면에 같이 배치해봤지만 정신이 사나웠다.

그리고 시간 미입력 시 반차에서 에러가 출력되는 것도 마음에 안들었다.

= iferror( ... ) 

을 사용하면 되지만 근본적인 해결 방법이 아닌 것 같았다.

기능 개선

  • 숨기기 처리한 행에 별도의 반차 계산 함수를 작성.

    = if({셀 주소}="","[◀] 선택",{셀 주소}+time(4,0,0))
    
    // 시간 미입력 : ◀ 선택 노출
    // 시간 입력 : 기록된 시간 + 4H 
  • 그리고 종일, 반차 항목값을 사용하는 dropdown 메뉴를 추가하고
    if 함수를 사용하여 선택된 항목값에 따라 다른 시간이 노출되도록 만들었다.

    = if(E4="종일",F3,if(E4="반차",G3))
    
    // 종일 선택 : +9H 값 노출
    // 반차 선택 : +4H 값 노출

그리고 결론

오늘은 일요일,

어제 새벽 5시까지 잠을 설치면서 아무 생각없이 입력한 검색어

'구글 시트 스크립트 셀이 공백이면'      >> 결과로 isblank가 나왔다. 

'구글 시트 스크립트 isblank'          >> 위와 동일한 결과가 나왔다. 

'google app script if isblank'    >> 유레카. 스택오버플로는 신이야..

일어나자마자 컴퓨터를 켜고 if 문에 반영해봤다.

if(cell.isBlank())  {
    Browser.msgBox('지금 출근하셨나요?','현재 시간이 입력됩니다.',Browser.Buttons.OK)
    cell.setValue(currentTime);
  }
else {
    Browser.msgBox('경고!','이미 설정된 시간이 있습니다.',Browser.Buttons.OK)
  }

시간 미입력 : 메세지 박스가 뜨고, 시간 입력
시간 기입력 : 경고 메세지 박스가 뜨고 시간이 기록되지 않음.

원래는 다음주에 일정이 없으면 자바스크립트 공부 겸
시간 보내는 용도로 하려던 건데.... 주말에 다 만들어버렸다...

오늘은 편안한 마음으로 베이킹을 하고, 게임을 하면 된다.

profile
QA. 손으로 할 수 있는 모든 것을 좋아합니다.

0개의 댓글