やりたいこと
現在、勤怠管理システムをGasを使って作成しています。その中で、出勤時間の登録と退勤時間の登録を同じ行で、別々のアクションで行いたいと考えています。
要件としては、以下のように考えています。
0. 出勤時にスタッフIDを入力し、出勤ボタンを押してもらう。
0. 出勤時の記録が連動したスプレッドシートに反映される。つまり、最終行を取得して、日付(A列)、スタッフID(B列)、出勤時間(C列)にセットされる。
0. 退勤時に、スタッフIDと退勤ボタンを押してもらう。
0. 退勤時の記録が連動したスプレッドシートに反映される。つまり、最終行を取得して、退勤時間(D列)にセットされる。
0. すでにスタッフIDが登録されている場合は、その登録IDと退勤時登録のIDが合致しているかを確認し、間違っていなければ、退勤時間が登録される。
0. 出勤時間の登録を忘れても、退勤ボタンが押されれば、本日の日付、スタッフID、退勤時間が登録される。
問題点
- 出勤時の処理と退勤時の処理が別々の行で行われる。これまでは、1回の処理で1行にデータを入れたことがあるが、複数の処理で1行にデータを入れる処理をしたことがなく四苦八苦している。
- 出勤時のスタッフIDと退勤時のスタッフIDが同じかどうかのmatch()の使い方が不明。
問題となるコード(特にgasの出勤時の処理と退勤時の処理をご確認ください)
html
1<!DOCTYPE html> 2<html> 3 <head> 4 <base target="_top"> 5 <meta charset="UTF-8"> 6 <meta viewport="width=device-width, initial-scale=1"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <?!=HtmlService.createHtmlOutputFromFile('css').getContent(); ?> 9 </head> 10 <body> 11 <div class="main"> 12 <div class="container"> 13 <div class="row"> 14 <div class="col-md-8 col-md-offset-2"> 15 <div class="row"> 16 <div class="col-md-6"> 17 <canvas width="300" height="260"> 18 Canvas not supported 19 </canvas> 20 <h1 id="time"></h1> 21 </div> 22 <div class="col-md-6"> 23 <form action="https://script.google.com/macros/s/@@@@/exec" method="post"> 24 <label for="staffId" class="form-label">Staff ID</label> 25 <input type="text" class="form-control mb-3" id="staffId" name="staffId"> 26 <button type="submit" id="attend-btn" class="btn btn-primary mb-3 btn-lg" name="attend" value="出勤時間" onclick="attendTime()">出勤</button> 27 <button type="submit" id="leave-btn" class="btn btn-primary mb-3 btn-lg" name="leave" value="退勤時間" onclick="leaveTime()">退勤</button> 28 </form> 29 </div> 30 </div> 31 </div> 32 </div> 33 </div> 34 </div> 35 <?!= HtmlService.createHtmlOutputFromFile("js").getContent(); ?> 36 </body> 37</html>
javascript
1<script> 2 google.script.run.withSuccessHandler.attendTime(); 3 google.script.run.withSuccessHandler.leaveTime(); 4</script>
gas
1//doGetでindex.htmlを表示する 2function doGet(){ 3 const htmlOutput = HtmlService.createTemplateFromFile("index").evaluate(); 4 return htmlOutput; 5} 6 7 8//doGetでindex.htmlに入力された値を取得してスプシへ移行 9function doPost(e){ 10 //var url ="https://docs.google.com/spreadsheets/d/@@@@@@@@@@@/edit#gid=0"; 11 const ss = SpreadsheetApp.openById('@@@@@'); 12 // スプレッドシートの中のシート名を指定して変数に格納。 13 const recordSheet = ss.getSheetByName('データ'); 14 15 //出勤時の処理 16 const date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd'); 17 const idNumber = e.parameters.staffId; 18 const attend = attendTime(); 19 const array = [date,idNumber,attend]; 20 recordSheet.appendRow(array); 21 22//退勤時の処理 23const lastRow = recordSheet.getDataRange().getLastRow(); //最終行を取得 24const firstColumn = recordSheet.getRange(1, lastRow+1, 1, 1).getValue(); 25const fourthColumn = recordSheet.getRange(4, lastRow+1, 1, 1).getValue(); 26const leave = leaveTime(); 27 28↓この処理が正しいのかが不明。 29if(leaveColumn.isBlank() || (firstColumn.isBlank() && leaveColumn.isBlank())){ 30 recordSheet.getRange(1, lastRow+1, 1, 1).setValue(date); 31 recordSheet.getRange(4, lastRow+1, 1, 1).setValue(leave); 32} 33 34 35//関数 showLastModifide の定義 36function attendTime(){ 37 const attendTime = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'HH:mm'); 38 return attendTime; 39} 40 41//関数 leaveTime の定義 42function leaveTime(){ 43 const leaveTime = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'HH:mm'); 44 return leaveTime; 45}
補足
htmlは、gasの「ウェブアプリケーションとして導入」で公開予定
以上、色々と試行錯誤して、解決に時間がかかっておりましたのでご相談させていただきました。
以前も関連するテーマで質問させていただいております(https://teratail.com/questions/314610)。
不明点などございましたら、ご連絡ください。