如何在OnEdit函数中使用Vlookup

时间:2019-08-08 17:44:15

标签: google-apps-script google-sheets

因此,我正在尝试创建一个考勤系统。基本上,我希望人们能够在名为考勤的表格中输入其ID号。在该列中输入信息后,相邻列(第2列)将使用其名称填充,而下一列(第三列)将使用输入时间填充。输入时间是使用新的Date()计算的。但是,我计划让它从位于名为“列表”的工作表上的主列表中检索名称。 “列表”表的ID在A列中,名称在B列中。所以我要做的是让google脚本通过查看最近编辑的单元格在Vlistup中模拟Vlookup,然后在“列表”列A中搜索该值将相邻列中对应的“列表”列B值返回到刚编辑的单元格。我希望能够在“出勤”表中多次执行此操作。因此,基本上,每天参加会议的人都会在“出勤”表中占据三列。

function onEdit(e) {
var sheet = e.source.getActiveSheet();
if (sheet.getName() === "Attendance") {
    var r = e.source.getActiveRange();
    if (r.getRow() != 1 && r.getColumn()%3 != 0 && r.getColumn()%3 != 2) {
    sheet.getRange(r.getRow(),r.getColumn()+2).setValue(new Date());
    var popsheet = SpreadsheetApp.getActiveSpreadsheet.GetSheetByName("list")
    var data=popsheet.getRange("A1:D100").getValues();
    for(i=0;i<data.length;++i){
    if (data[i][0]==r.GetValue()){
    sheet.getRange(r.getRow(),r.getColumn()+1).setValue(data[i][1]);
    }
    }
}

该日期可以很好地填充,但是名称可以不填充。我还没有收到任何错误消息。我尝试将在var popsheet = ...之后编写的所有内容更改为仅sheet.getRange(r.getRow(),r.getColumn()+ 1.setValue(“ test”)),实际上它确实在相邻的位置返回了“ test”从而使我相信问题在于我试图模仿Vlookup。

2 个答案:

答案 0 :(得分:2)

尝试一下:

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  if(sheet.getName()=="Attendance") {
    if (e.range.rowStart > 1 && e.range.columnStart % 3 == 1) {
      var sh=e.source.getSheetByName("list");
      e.source.toast(sh.getName());
      var data=sh.getRange(2,1,sh.getLastRow(),4).getValues();
      for(i=0;i<data.length;i++){
        if (data[i][0]==e.value){
          e.range.offset(0,1).setValue(data[i][2]);
          e.range.offset(0,2).setValue(Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:ss"));
        }
      }
    }
  }
}

如果找不到名称,这将清除同一行的后两列。

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  if(sheet.getName()=="Attendance") {
    if (e.range.rowStart > 1 && e.range.columnStart % 3 == 1) {
      var sh=e.source.getSheetByName("list");
      e.source.toast(sh.getName());
      var data=sh.getRange(2,1,sh.getLastRow(),4).getValues();
      var found=false;
      for(i=0;i<data.length;i++){
        if (data[i][0]==e.value){
          e.range.offset(0,1).setValue(data[i][2]);
          e.range.offset(0,2).setValue(Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:ss"));
          found=true;
        }
      }
      if(!found) {
        e.range.offset(0,1).setValue('');
        e.range.offset(0,2).setValue('');
      }
    }
  }
}

答案 1 :(得分:0)

我相信要更改此行:

sheet.getRange(r.getRow(),r.getColumn()+1.setValue(data[i][2]);

对此:

sheet.getRange(r.getRow(),r.getColumn()+1).setValue(data[i][1]);

应该解决您的问题。

data [i] [2]对应于第 i 行和第3列(A列),但是我相信您想要data [i] [1],它将是列B。