Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google Apps脚本:使用onEdit()函数在两个不同触发器后排列时间戳?_Javascript_Google Apps Script - Fatal编程技术网

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…如果多人同时编辑,这行吗?假设我想拥有所有的教室,让每个人都可以编辑?它还能玩得开心吗?他们在编辑同一个电子表格吗?