修改脚本,以在每次进行编辑时将列表中的数据验证和该数据验证的编辑时间戳复制到新行

时间:2018-12-21 17:05:15

标签: google-sheets

我为自习室创建了一个登机牌,学生可以从母版页的下拉菜单中进行选择,以找到目的地,这也创建了时间戳,并将行复制到另一个选项卡,每个班级老师可以监控该选项卡,以查看谁应该在自己的教室中房间以及他们离开前一个房间的时间。这样,教师可以查看自己的个人页面,随时查看谁应该在自己的房间里,他们会知道谁应该去他们的房间,并且他们可以访问自己的孩子在母版上的去向。需要。

一些老师全天问有关使用该系统的问题,因为他们徘徊的学生或试图在每个时期离开的学生。现在,我正在运行的脚本将在每次编辑时更新下拉列和时间戳,但是,我还想在学生每次离开一个房间时将编辑的下拉列表和时间戳信息复制到母版的新列上。去另一个。这样,教师可以在母版列表上看到学生上课的时间和地点,这可以帮助您确定可能需要解决的问题。我创建了名为“目标1”和“时间1”,“目标2”和“时间2”等的新列,但是我不确定如何将信息获取到这些列。每次学生离开时,我都希望将信息放入他们姓名旁边的第一列。

仅供参考,我以前仅修改了一些脚本,没有编写自己的脚本。

链接到Google Doc I安装程序的副本。 “母版”选项卡包含所有学生的副本,其他每个选项卡根据F行中的选择从母版中提取信息。

https://docs.google.com/spreadsheets/d/1JDdiKGGIaOVBUSIVxOTK56uceerR1iNuoD7wKowqAfU/edit?usp=sharing

function onEdit(event)
{ 
  var timezone = "EST";
  var timestamp_format = "HH:mm:ss"; // Timestamp Format. 
  var updateColName = "Student Destination";
  var timeStampColName = "Time";
  var sheet = event.source.getSheetByName('Master'); //Name of the 
sheet where you want to run this script.

  var actRng = event.source.getActiveRange();
  var editColumn = actRng.getColumn();
  var index = actRng.getRowIndex();
  var headers = sheet.getRange(1, 1, 1, 
sheet.getLastColumn()).getValues();
  var dateCol = headers[0].indexOf(timeStampColName);
  var updateCol = headers[0].indexOf(updateColName); updateCol = 
updateCol+1;
  if (dateCol > -1 && index > 1 && editColumn == updateCol) { // 
only timestamp if 'Last Updated' header exists, but not in the 
header row itself!
    var cell = sheet.getRange(index, dateCol + 1);
    var date = Utilities.formatDate(new Date(), timezone, 
timestamp_format);
    cell.setValue(date);
  }
}

当我在F行中选择目的地时,将生成时间戳记,并且其他选项卡也会更新。我只需要将每个编辑结果复制到名为“目标1”和“时间1”,“目标2”和“时间2”等的新列中即可。

1 个答案:

答案 0 :(得分:0)

OP代码很好,但是没有使用onEdit。 onEdit函数/触发器的event参数提供有关编辑的数据。详细信息在documentation中进行说明。

在OP概述的情况下,第一个问题是评估G列中是否已有时间。

现有时间?
如果存在时间,则必须将目的地1到5中的任何现有数据复制到目的地2到6,然后必须将现有的学生姓名和时间复制到目的地1,然后,只有这样,新日期才能可以应用。

1-必须将目标1到5中的现有数据复制到目标2到6

var rangeToCopy = sheet.getRange(actRngRow, 9, 1, 10);
rangeToCopy.copyTo(sheet.getRange(actRngRow, 11));

这留出了空间,可以将现有的学生姓名和时间复制/粘贴到目的地1。

2-将现有的学生姓名和时间复制到目的地1

var oldDate = sheet.getRange(actRngRow, actRngCol + 1);`
This is simply the column beside the edited cell.

// copy the old student name and date to destination 1
var oldStudentName = event.oldValue;
var oldDateValue = oldDate.getValue();
var Dest1StudentName = actRng.offset(0, 3).setValue(oldStudentName);
var Dest1DateValue = actRng.offset(0, 4).setValue(oldDateValue);

offset使代码可以使用相对引用。在这种情况下,列引用是已编辑单元格右边的列数。 event.oldValue提供了学生的姓名,时间是G列中的值(因为我们尚未更新该列)。

在G列中插入更新时间
现有代码效果很好

// add the date to the adjacent cell
var cell = sheet.getRange(actRngRow, actRngCol + 1);
var newdate = Utilities.formatDate(new Date(), timezone, timestamp_format);
cell.setValue(newdate);

完整的代码是:

function onEdit(event) {
    Logger.log("start onedit");
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Master")
    //so_53888444
    var timezone = "EST";
    var timestamp_format = "HH:mm:ss"; // Timestamp Format. 
    var updateColName = "Student Destination";
    var timeStampColName = "Time";
    //var debug_e = {
    //  authMode:  event.authMode,  
    //  range:  event.range.getA1Notation(),    
    //  source:  event.source.getId(),
    //  user:  event.user,   
    //  value:  event.value,
    //  oldValue: event. oldValue
    //};
    //Logger.log("AuthMode: "+debug_event.authMode);// DEBUG
    //Logger.log("Range: "+debug_event.range);// DEBUG
    //Logger.log("Source: "+debug_event.source);// DEBUG
    //Logger.log("User: "+debug_event.user);// DEBUG
    //Logger.log("user email"+debug_event.user.getEmail());// DEBUG
    //Logger.log("Value: "+debug_event.value);// DEBUG
    //Logger.log("Old value: "+debug_event.oldValue);// DEBUG
    //Logger.log("AuthMode: "+debug_event.authMode+", Range: "+debug_event.range+", source: "+debug_event.source+", user: "+debug_event.user+", value: "+debug_event.value+", old value: "+debug_event.oldValue);// DEBUG
    //Logger.log("the old value: "+event.oldValue);
    var actRng = event.range;
    //Logger.log("the edited range was " + actRng.getA1Notation()); //DEBUG
    var actRngRow = actRng.getRow();
    var actRngCol = actRng.getColumn();
    var oldDate = sheet.getRange(actRngRow, actRngCol + 1);
    var status = 0;
    if (actRngRow > 1 && actRngCol == 6) { // only timestamp if 'Last Updated' header exists, but not in the header row 
        if (oldDate.isBlank()) {
            //Logger.log("the date is blank - no historic data to copy");
        } else {
            //Logger.log("the date NOT  blank - copy the historic data");
            // copy/paste existing destinations
            var rangeToCopy = sheet.getRange(actRngRow, 9, 1, 10);
            rangeToCopy.copyTo(sheet.getRange(actRngRow, 11));

            // copy the old student name and date to destination 1
            var oldStudentName = event.oldValue;
            var oldDateValue = oldDate.getValue();
            var Dest1StudentName = actRng.offset(0, 3).setValue(oldStudentName);
            var Dest1DateValue = actRng.offset(0, 4).setValue(oldDateValue);
        }

        // add the date to the adjacent cell
        var cell = sheet.getRange(actRngRow, actRngCol + 1);
        var newdate = Utilities.formatDate(new Date(), timezone, timestamp_format);
        cell.setValue(newdate);
    }

}