6~7時間くらいで作っちゃいました。
トップページに執行部のメンバーごとのボタンを設置しています。このボタンを押すとGASのWebアプリが埋め込まれたサブページに飛びます。
※デモ版ではボタンを押すと直接Webアプリに飛びます。
このようにして、
誰が
今は在室中なのか
何時に生徒会室に入ってきたのか
を管理しています。
この表はサイトのトップに表示しているので、今生徒会室に誰がいるのかを離れた場所にいても知ることができるかもしれません。
この部分がGASで作成したWebアプリです。Googleサイトに埋め込まれています。
※デモ版では埋め込まずにWebアプリに直接飛ぶように、ボタンを置いています。
デプロイURLに「https://~~~~~~~/exec?name=書記」のようにすることで、「誰が」の部分をGAS側に渡しています。
この表はログですが、タイムスタンプが変になっていますね。
それ意外は正しいです。
let name = ""
let time = ""
let msg = ""
let info = ""
let result
let startTime = ""
let endTime = "--:--:--"
let rowNumOfRegisteredName = -1
const logerUrl = "**********************************"
const sheetLog = SpreadsheetApp.openById(logerUrl).getSheetByName("log");
const sheetStatus = SpreadsheetApp.openById(logerUrl).getSheetByName("status");
function doGet(e) {
time = Utilities.formatDate( new Date, 'Asia/Tokyo', 'yyyy/mm/dd hh:mm:ss')
name = e.parameter.name;
if(status()){
info = "退場"
}else{
info = "入場"
}
sheetLog.getRange(sheetLog.getLastRow()+1,1,1,3).setValues([[time,name,info]]);
console.log( time + "," + name + "," + info + "]" )
console.log("The html file was created.")
return HtmlService.createTemplateFromFile("html").evaluate();
}
function agreement(){
if(result){
msg = "おつかれ!\n" + calculateDuration() + "もよく頑張ったね!\n今日もありがと!"
}else{
msg = "いらっしゃい!\nがんばれ!"
}
console.log("やあ!"+ name + "!!" + msg)
return "やあ!"+ name + "!!" + msg
}
function status(){
rowNumOfRegisteredName = sheetStatus.getRange(1,1,sheetStatus.getLastRow(),1).getValues().flat().indexOf(name) +1;
if(rowNumOfRegisteredName == 0){
sheetStatus.insertRowAfter(1);
sheetStatus.getRange(2,1,1,2).setValues([[name,false]]);
console.log(name + " was registered")
rowNumOfRegisteredName = 2
result = false
}else{
result = sheetStatus.getRange(rowNumOfRegisteredName,2).getValue();
}
sheetStatus.getRange(rowNumOfRegisteredName,2).setValue(!result)
console.log(name +"'s status was marked as "+ !result)
if(!result){
sheetStatus.getRange(rowNumOfRegisteredName,3).setValue(time)
}
return result
}
function calculateDuration(){
console.log(rowNumOfRegisteredName)
startTime = sheetStatus.getRange(rowNumOfRegisteredName,3).getValue()
if(startTime.length==18){
startTime = "0" + startTime.substring(10,18)
}else{
startTime = startTime.substring(11,19)
}
if(time.length==18){
endTime = "0" + time.substring(10,18)
}else{
endTime = time.substring(11,19)
}
const durationHour = parseInt(endTime.substring(0,2)) - parseInt(startTime.substring(0,2))
const durationMin = parseInt(endTime.substring(3,5)) - parseInt(startTime.substring(3,5))
const duration = durationHour + "時間" + durationMin + "分"
return duration;
}
function getStartTime(){
if(result){
//退出時
return startTime
}else{
//入場時
return time.substring(11,19)
}
}
//執行部が新しくなって、メンバーを一掃してシステムを再始動する際にreset()関数を使います。
function reset(){
sheetStatus.getRange(2,1,sheetStatus.getLastRow(),sheetStatus.getLastColumn()).clear();
sheetLog.getRange(2,1,sheetLog.getLastRow(),sheetLog.getLastColumn()).clear()
}
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<h3><?=agreement(); ?></h3>
<h3>開始:<?=getStartTime(); ?><br>終了:<?=endTime; ?></h3>
</body>
</html>