如何解决教师缩放出勤工具
我是一位老师,正在设计一种工具来利用Zoom使用情况数据(我们生活的日子!)
Zoom提供了一些报告,您可以复制,粘贴和保持表格格式。像这样:
Luke Name Name
lr@email.com
09/10/2020 08:22:03 AM 09/10/2020 08:33:36 AM 12
Barbara Name Name
bar@email.com
09/10/2020 08:22:12 AM 09/10/2020 08:31:57 AM 10
Joaquin Name Name Name
joa@email.com
09/10/2020 08:22:12 AM 09/10/2020 08:31:59 AM 10
Rafaella Name Name
raf@email.com
09/10/2020 08:22:18 AM 09/10/2020 08:31:55 AM 10
Andrea Name Name
and@email.com
09/10/2020 08:22:19 AM 09/10/2020 08:32:14 AM 10
Sara Name Name Name
sar@email.com
09/10/2020 08:22:20 AM 09/10/2020 08:31:56 AM 10
如果将其发布到文本编辑器或Google表格中,它将正确格式化为行和列。
我的代码现在需要很长的信息字符串,并切掉所有不是电子邮件的内容,然后针对班级列表检查电子邮件,以查看谁缺席。我现在想要做的是让它检查迟到的学生。理想情况下,用户将输入字符串并开始上课时间,并显示缺席学生和单独的迟到学生。
我认为我不知道的部分是用户如何将信息复制粘贴到提示或html textarea中,然后正确地将其写入行和列中,以便我可以操纵数据。
代码:
//this function copies the info to a spreadsheet and sets formulas in order to find just emails and check them against a student list
function checkAttendance() {
var ss = SpreadsheetApp
var sheet = ss.getActiveSheet();
var response = SpreadsheetApp.getUi().prompt("Student Attendance","Paste emails of students who attended.",SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
if(response.getSelectedButton() == SpreadsheetApp.getUi().Button.CANCEL) {return}
var responseText = response.getResponseText();
var splitText = responseText.split(" ");
var atHandle = SpreadsheetApp.getActive().getSheetByName("Attendance Handling");
atHandle.getRange(2,1,200,100).clear();
atHandle.getRange(2,3).setFormula("=FILTER(B2:B,ISNA(MATCH(B2:B,A2:A,0)))");
var colNum = getColNum2("Student Email");
var rows = sheet.getLastRow();
sheet.getRange(2,colNum,rows-1,1).copyTo(atHandle.getRange(2,2,rows,1));
atHandle.getRange(2,1).setFormula('=TRANSPOSE(SPLIT(E2," "))');
atHandle.getRange(2,4).setFormula('=FILTER(A2:A,ISNA(MATCH(A2:A,B2:B,0)))')
atHandle.getRange(2,5).setValue(responseText);
atHandle.getRange(2,6).setFormula('=if(AND(IFERROR(SEARCH("@",D2),"") <> "",IFERROR(SEARCH("(","") = ""),D2,"")');
SpreadsheetApp.getActive().getSheetByName("Attendance Handling").getRange(2,6).copyTo(SpreadsheetApp.getActive().getSheetByName("Attendance Handling").getRange(2,6,1));
atHandle.getRange(2,7).setFormula('=FILTER(F2:F,F2:F <> "")');
showAttendance()
}
function showAttendance() {
var atHandle = SpreadsheetApp.getActive().getSheetByName("Attendance Handling");
var rows1 = getLastRow(3);
var rows2 = getLastRow(7)
var absent = atHandle.getRange(2,3,rows1-1,1).getValues().join("\n");
var present = atHandle.getRange(2,7,rows2-1,1).getValues().join("\n");
var t = HtmlService.createTemplateFromFile('attendance'); // Modified
t.Absent = absent
t.Present = present
html = t.evaluate().setWidth(600).setHeight(345); // Added
SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
.showModalDialog(html,'Class Attendance');
}
<!DOCTYPE html>
<html>
<head>
<base target="_top">
//style removed for space
</head>
<body>
<form>
<div>
Absent (in student list but not in pasted values):
<br>
<textarea id="tofield" name="tofield" rows="9" cols="60"><?!= Absent ?></textarea>
<br>
Guests (present in pasted values but not in student list):
<br>
<textarea id="tofield" name="tofield" rows="9" cols="60"><?!= Present ?></textarea>
<br>
<p>
</p>
</form>
Note: this information is not saved. Please use or copy and paste this information as needed beforing closing.
<p>
<button id="btn" style="margin-left: 8px; font-size: 15px; padding: 5px" onclick='google.script.host.close();' class="sbtn btn btn-secondary btn-c">Close</button>
</p>
</body>
</html>
解决方法
您需要使用类似google.script.run.doSomething(data)
的值将值从客户端传递到服务器端代码,其中doSomething
是服务器端函数,而data
是一个保存值/您要传递给客户端的对象。
注意:关于可以将哪些值/对象类型传递给服务器端存在一些限制,即,不能传递日期对象,但是您可以将字符串插入相应的毫秒数。
以下代码将输入的样本数据转换为二维数组,可以使用setValues(values)
将其传递到图纸。
var data = `Luke Name Name
lr@email.com
09/10/2020 08:22:03 AM 09/10/2020 08:33:36 AM 12
Barbara Name Name
bar@email.com
09/10/2020 08:22:12 AM 09/10/2020 08:31:57 AM 10
Joaquin Name Name Name
joa@email.com
09/10/2020 08:22:12 AM 09/10/2020 08:31:59 AM 10
Rafaella Name Name
raf@email.com
09/10/2020 08:22:18 AM 09/10/2020 08:31:55 AM 10
Andrea Name Name
and@email.com
09/10/2020 08:22:19 AM 09/10/2020 08:32:14 AM 10
Sara Name Name Name
sar@email.com
09/10/2020 08:22:20 AM 09/10/2020 08:31:56 AM 10`;
const arr = data.split('\n');
const matrix = [];
for(let i = 0; i < arr.length;i = i + 3){
var row = [arr[i],arr[i+1],new Date(arr[i+2].slice(0,22)),new Date(arr[i+2].slice(24,46)),arr[i+2].slice(48)]
matrix.push(row);
}
console.info(matrix);
我建议您如前所述,在服务器端使用上述命令,因为Date对象不能从客户端传递到服务器端,因此请确保已使用Apps脚本,电子表格和Zoom相同的时区,否则您将对其进行改进以适当地处理时区差异。
资源
,您可以根据解析出的时间构造一个新的Date
对象并进行比较。如果可以获取dat的字符串describeaiotn,则可以将其直接传递给Date
的construcotr
new Date('December 17,1995 03:24:00');
一旦有了日期,就可以使用运算符进行比较,并确定学生是否迟到。
function isLate(classStart) {
var dateStr = /* get the cell value */
var studentArrvial = Date.parse(dateStr)
return studentArrival - dateStr > 0
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。