有什么办法可以让我向上搜索价值?

时间:2019-07-05 05:52:34

标签: google-apps-script google-sheets appscript

我想知道是否有人知道是否可以向上搜索一个值,而不是通常在列中向上搜索。

之所以问,是因为我目前正在准备一个访客表,该表将从Google表单中记录到Google表格中。 每个访客都会获得一个ID /通行证编号,该ID /通行证编号将用于记录他们的出入时间。

现在的问题是,如果两个人使用相同的ID,它将仅更改初始条目的进入和退出时间,而不会更改最新条目。

因此,我想知道是否有人知道或者有可能使脚本可以向上搜索(以便先找到较新的条目),或者有人知道一个命令以便它不会覆盖先前的条目(忽略已经在单元格中记录了时间的条目)。

我已经尝试使用QUERY和IMPORTRANGE将其分类到新的标签中,但是我无法将时间记录到新的标签上。

var ss = SpreadsheetApp.openByUrl("sheet_url");
var sheet = ss.getSheetByName("Sheet_name");

function doGet(e){
  var action  = e.parameter.action;

  if(action == "in")
    return inTime(e);

  if(action == "out")
    return outTime(e);

}


function doPost(e){
  var action  = e.parameter.action;

  if(action == "in")
    return inTime(e);

  if(action == "out")
    return outTime(e);

}

function inTime(e){
  var id = e.parameter.id;
  var values = sheet.getRange(2,1,sheet.getLastRow(),1).getValues();

  for(var i = 0 ; i<values.length ; i++){
    if(values[i][0] == id){
      i=i+2;
      var in_time = Utilities.formatDate(new Date(), "GMT+8", "HH:mm:ss");
      sheet.getRange(i,8).setValue(in_time);
      return ContentService.createTextOutput("Check In Time "+in_time).setMimeType(ContentService.MimeType.TEXT);


  }
  return ContentService.createTextOutput("Id Not Found").setMimeType(ContentService.MimeType.TEXT);
}


function outTime(e){
  var id = e.parameter.id;
  var values = sheet.getRange(2,1,sheet.getLastRow(),1).getValues();

  for(var i = 0 ; i<values.length ; i++){
    if(values[i][0] == id){
      i=i+2;
      var out_time = Utilities.formatDate(new Date(), "GMT+8", "HH:mm:ss");
      sheet.getRange(i,9).setValue(out_time);
      return ContentService.createTextOutput("Check Out Time "+out_time).setMimeType(ContentService.MimeType.TEXT);
    }
  }
  return ContentService.createTextOutput("Id Not Found").setMimeType(ContentService.MimeType.TEXT);
}

2 个答案:

答案 0 :(得分:1)

浏览“值”时,您可以向上/向后查找第一个较新的条目(假设较新的位于底部):

  for (var i = (values.length - 1); i > -1; i--) {

对于另一个问题,关于如何检查第8列中的单元格是否为空白,您可以尝试以下方法:

  if (values[i][0] == id && values[i][7] == "") {

答案 1 :(得分:0)

对于您的脚本而言,一个好的解决方案是在循环内部实现辅助变量var k=values.length-i-1,该循环允许您向后循环。

您的循环将如下所示:

function inTime(e){
  var id = e.parameter.id;
  var values = sheet.getRange(2,1,sheet.getLastRow(),1).getValues();

  for(var i = 0 ; i<values.length ; i++){
    var k=values.length-i-1;
    if(values[k][0] == id){
      k=k+2;
      var in_time = Utilities.formatDate(new Date(), "GMT+8", "HH:mm:ss");
      sheet.getRange(k,8).setValue(in_time);
      return ContentService.createTextOutput("Check In Time "+in_time).setMimeType(ContentService.MimeType.TEXT);
      }
  }
}