今回はタイムカードのスクリプトを全部書き込みます。
前回同様にスクリプトエディタを開きます。
前回保存したスクリプトは残っていますでしょうか。
前回書き込んだスクリプトの下に、以下順次掲載するスクリプトを追加していきます。
1.処理中…を表示するスクリプト
ボタンをクリック後、処理に時間がかかるのでメッセージを表示するスクリプトを準備します。
表示するための日時や名前などの情報は、前回書いたスクリプトで変数に格納済みですので、ここでは各変数をオブジェクト’app’としたウィンドウに書き出すだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//状態確認画面を表示して「処理中」を表示する function disp_wait() { var dispdatetime="処理中..."; var dispcondition=""; var dispcolor="gray"; //書き出し app.getElementById("today").setText(today); app.getElementById("member").setText(element_member); app.getElementById("lastdatetime").setText(dispdatetime); app.getElementById("lastdatetime").setStyleAttribute('color', dispcolor); app.getElementById("lastcondition").setText(dispcondition); app.getElementById("lastcondition").setStyleAttribute('color', dispcolor); //表示 sheet.show(app); } |
2.状況確認を表示するスクリプト
ボタンをクリック後、出勤や退勤の状態を確認するためのスクリプトです。「処理中…」を表示するスクリプトで書き出したのと同じappに表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
//状態確認画面に情報を書き込む function disp_condition(click_condition_str) { //現状として表示するため、記録から直前の状態を検索する var range=logs.getDataRange(); var datas=range.getValues(); var row; var ymd; var condition="未出社"; var st="23:59:59"; var et="00:00:00"; var time; var lasttime="00:00:00"; var lastdatetime="0000/00/00 00:00:00"; var lastcondition="なし"; var datetime; for(i in datas) { if(i>0) { row=datas[i]; if(row[0]!="") { if(ymd=Utilities.formatDate(row[0], "GMT+9:00", "yyyy/MM/dd")) { time=Utilities.formatDate(row[0], "GMT+9:00", "HH:mm:ss"); if(mailaddress==row[1]) { if(ymd==today) { if(time>lasttime) { lasttime=time; condition=row[2]; } if(row[2]=="出勤") { if(time<st) { st=time; } }else{ if(time>et) { et=time; } } }else{ if(ymd<today) { datetime=ymd+" "+time; if(lastdatetime<datetime) { lastdatetime=datetime; lastcondition=row[2]; } } } } } } } } //表示データをセット var dispdatetime; var dispcondition; var dispcolor; var disp_condition_str; switch(condition) { case "未出社": dispdatetime="前回は、"+lastdatetime+"に「"+lastcondition+"」が押されました。"; dispcondition="未出社"; dispcolor="gray"; break; case "出勤": dispdatetime="本日の"+st+"に「"+condition+"」が押されています。"; dispcondition="勤務中"; dispcolor="blue"; break; case "退勤": dispdatetime="本日の"+et+"に「"+condition+"」が押されています。"; dispcondition="帰宅済"; dispcolor="red"; break; } //パラメータで与えられた文章があれば、変数に上書きセット if(arguments.length>0) { dispdatetime=click_condition_str; } //書き出し app.getElementById("today").setText(today); app.getElementById("member").setText(element_member); app.getElementById("lastdatetime").setText(dispdatetime); app.getElementById("lastdatetime").setStyleAttribute('color', dispcolor); app.getElementById("lastcondition").setText(dispcondition); app.getElementById("lastcondition").setStyleAttribute('color', dispcolor); //ポップアップ表示 control.setColumnWidth(1,300); control.setRowHeight(1,480); control.activate(); sheet.show(app); } |
3.出社ボタンを押されたときのスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 |
//出勤ボタンを押したときの処理 function onClickButton1() { //状況確認画面を表示する disp_wait(); //出勤を記録 click_condition_str=onClickButton_sub("出勤"); //onClickButton_subの戻り値をパラメータに与えて状況確認画面を表示する disp_condition(click_condition_str); } |
4.退社ボタンを押されたときのスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 |
//退勤ボタンを押したときの処理 function onClickButton2() { //状況確認画面を表示する disp_wait(); //退勤を記録 click_condition_str=onClickButton_sub("退勤"); //onClickButton_subの戻り値をパラメータに与えて状況確認画面を表示する disp_condition(click_condition_str); } |
5.記録するためのスクリプト
TimeCardLogシートに出退勤を記録し、記録完了、またはエラーのメッセージを戻り値として返します。
呼び出した側は、戻り値をそのままdisp_condition()のパラメータにすれば状況を表示できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
//出勤や退勤の記録を一行追加保存する function onClickButton_sub(click_condition) { var click_condition_str=""; var lock = LockService.getPublicLock(); var has_mutex = lock.tryLock(10000); if(has_mutex) { //データを挿入する行を特定 var lastrow=logs.getLastRow(); var maxrow=logs.getMaxRows(); lastrow++; //シートの最下段だったら1行追加する if(lastrow+1>=maxrow) { logs.insertRowAfter(maxrow); } //記録を挿入する var mailaddress=Session.getActiveUser().getEmail(); var dd = new Date(); var wrange=logs.getRange(lastrow, 1, 1, 3); wdatas=[[dd,mailaddress,click_condition]]; wrange.setValues(wdatas); //状況確認画面への表示用文章を作成 click_condition_str=Utilities.formatDate(dd, "GMT+9:00", "HH:mm:ss"); click_condition_str= click_condition_str+"に「"+click_condition+"」が押されました。"; //スプレッドシートの再表示 SpreadsheetApp.flush(); lock.releaseLock(); }else{ //エラーの文章 click_condition_str="同時に多数のタイムカードが押され処理できませんでした。クリックし直して下さい。"; } //状況確認画面に表示するための文章を戻り値として返す return click_condition_str; } |
スクリプトが完成しました。
すべて縦につなげて書き込むと、こんな感じ↓になります。
今回はここまで。
次回、今回作ったスクリプトをボタンに割り付けて、タイムレコーダーが完成します。
次回は、今回作成したスクリプトにポップアップウィンドウを表示するためのコードを追加します。