Javascript Google Apps脚本:使用onEdit()函数在两个不同触发器后排列时间戳?
我正在为学生离开教室的时间创建日志。每当我勾选学生姓名旁边的复选框时,日志中就会填入学生的姓名、班级和课余时间。当该框未选中时,将在日志中输入返回的时间 但是,正如您从图像中看到的,返回的时间会在新行中输入 如果是同一个学生,是否可以通过脚本让时间回到课堂,与前一行保持一致?理想情况下,这将与一个以上的学生在同一时间离开课堂Javascript Google Apps脚本:使用onEdit()函数在两个不同触发器后排列时间戳?,javascript,google-apps-script,Javascript,Google Apps Script,我正在为学生离开教室的时间创建日志。每当我勾选学生姓名旁边的复选框时,日志中就会填入学生的姓名、班级和课余时间。当该框未选中时,将在日志中输入返回的时间 但是,正如您从图像中看到的,返回的时间会在新行中输入 如果是同一个学生,是否可以通过脚本让时间回到课堂,与前一行保持一致?理想情况下,这将与一个以上的学生在同一时间离开课堂 function onEdit(e) { // If a box is unchecked in the list... if(s.getName()
function onEdit(e) {
// If a box is unchecked in the list...
if(s.getName() != "Log" && r.getColumn() == 2 && r.getValue() == false ) {
for(var o = 0; o < spot.length; o++){
spot = spot - o;
if (sn == StudentName) {
Log[4].setValue(CurrentDate);
}
}
Student[0].copyTo(Log[0]);
Student[1].copyTo(Log[1]);
Student[2].copyTo(Log[2]);
Log[4].setValue(CurrentDate);
}
函数onEdit(e){
//如果列表中的框未选中。。。
如果(s.getName()!=“Log”&&r.getColumn()==2&&r.getValue()==false){
对于(变量o=0;o
最后四行来自原始代码。我知道这就是信息出现在新行上的原因…我不明白为什么“for”元素不会检查学生姓名是否与行匹配。如果可能,我可以删除最后四行代码
我希望我已经足够清楚我想要什么。我使用PropertiesService.getUserProperties()来存储行号
function onEdit(e) {
//e.source.toast('entry');
//Logger.log(JSON.stringify(e));
var sh = e.range.getSheet();
if (sh.getName() != "Log" && e.range.columnStart == 2) {
sh.getRange(e.range.rowStart,e.range.columnStart).setBackground('#ffff00');
var tsh = e.source.getSheetByName("Log");
var spot = tsh.getLastRow() + 1;
var CurrentDate = new Date();
var sn = sh.getRange(e.range.rowStart, 1);
var hr = sh.getRange(e.range.rowStart, 3);
var br = sh.getRange(e.range.rowStart, 4);
var Student = [sn, hr, br];
var StudentName = tsh.getRange(spot, 1);
var Homeroom = tsh.getRange(spot, 2);
var List = tsh.getRange(spot, 3);
var TimeOut = tsh.getRange(spot, 4);
var TimeIn = tsh.getRange(spot, 5);
var Log = [StudentName, Homeroom, List, TimeOut, TimeIn];
if (e.value == 'TRUE') {
e.source.toast('leave');
Student[0].copyTo(Log[0]);
Student[1].copyTo(Log[1]);
Student[2].copyTo(Log[2]);
Log[3].setValue(CurrentDate);
let psObj = PropertiesService.getUserProperties().getProperties();
psObj[Student.map(r => r.getValue()).join()] = spot;//this saves the current row number in the user properties so that it will be available for their return.
PropertiesService.getUserProperties().setProperties(psObj);
}
if (e.value == 'FALSE') {
e.source.toast('return');
let oldspot = parseInt(PropertiesService.getUserProperties().getProperties()[Student.map(r => r.getValue()).join()]);//This gets the last row used in the log sheet
tsh.getRange(oldspot, 5).setValue(CurrentDate);
}
sh.getRange(e.range.rowStart,e.range.columnStart).setBackground('#ffffff');
}
}
这是我的活动工作表的外观:
第二列是复选框值
学生
等级
列表
S1
错误的
C1
L1
S2
错误的
C2
L2
S3
错误的
C3
L3
S4
错误的
补体第四成份
L4
S5
错误的
碳五
L5
中六
错误的
C6
L6
wr是未定义的doops抱歉。“wr”是较大代码的一部分,但不是我试图实现的目标所必需的。我删除了它。您在代码上做得非常好。我喜欢使用它。尽管我倾向于尝试更多地使用事件对象参数。我可能实际上对此有点强迫性。谢谢!我实际上正在进行修订对其进行放大以提高效率,并减少冗余行的数量。我只需要找出谜题的最后一部分,我应该感到“高兴”有了它。我会把我的工作副本保留几天,以防你有后续问题。谢谢@MetaMan!我已经设法在我自己的代码中实现了其中的一些方面。我试图简单地“复制粘贴”你的代码作为一个整体,但由于某些原因,它的输出方式与你的不一样。我的日志仍然将时间放回到课堂上在另一行,或者根本不输出任何内容。你有访问PropertiesService的权限吗?我刚刚注意到了编辑。现在是
oldspot
。看看这个!它工作了!还有一个问题@MetaMan…如果多人同时编辑,这行吗?假设我想拥有所有的教室,让每个人都可以编辑?它还能玩得开心吗?他们在编辑同一个电子表格吗?