谷歌应用程序脚本:使用onEdit()函数在两个不同的触发器后排列时间戳



我正在创建学生离开教室的日志。每当我勾选他们名字旁边的框时,日志就会填写学生的名字、班级和下课时间。当该框未选中时,将在日志中输入返回的时间。

然而,正如您从图像中看到的那样,返回的时间将在新行中输入。

当前代码的示例

如果是同一个学生,是否可以通过脚本让课堂上的时间与前一行保持一致?理想情况下,这将适用于同时有多个学生离开课堂。

function onEdit(e) {

// Variable to establish spreadsheet and range selected.
var ss = SpreadsheetApp.getActive();
var sh = ss.getActiveSheet();
// Variable to call on the 'Activity Log' spreadsheet.
var aL = ss.getSheetByName("Log");
// Variable to swap to the next row in the Activity Log every time a box is checked.
var spot = aL.getLastRow() + 1;
// Variable for the timestamp.
var CurrentDate = new Date();

// These variables are defined. Just shortening the code for conciseness.
var Student = [sn,hr,ln];
var Log = [StudentName,Homeroom,List];
if (r.getValue() == true) {
for (var i = 0; i < Student.length ; i++){
Log[i].setValue(Student[i])
};
aL.getRange(spot,4).setValue(CurrentDate);
}

if (r.getValue() == false) {
aL.getRange(spot, 5).setValue(CurrentDate);
}
}

最后四行来自原始代码。我知道这就是为什么信息会出现在新行。。。我不明白为什么"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');
}
}

这就是我的活动表:

第二列是复选框值

>L5>L6
学生
S1S3S5FALSEC5
S6FALSEC6

最新更新