Есть ли способ, чтобы я мог искать значение вверх? - PullRequest
0 голосов
/ 05 июля 2019

Мне было интересно, знает ли кто-нибудь, можно ли искать значение вверх по столбцу вместо обычного вверх или вниз в столбце.

Причина, по которой я спрашиваю, заключается в том, что в настоящее время я готовлю лист посетителя, который будет записан в Google Sheets, который поступает из Google Forms. Каждому посетителю будет присвоен идентификационный номер / номер пропуска, который будет использоваться для записи времени его входа и выхода.

Проблема теперь в том, что, если два человека используют один и тот же идентификатор, он изменит только время входа и выхода начальной записи, а не самую последнюю.

Поэтому мне было интересно, знает ли кто-нибудь или это возможно, чтобы скрипт мог искать вверх вместо этого (чтобы более новая запись была найдена первой), или если кто-то знает команду, чтобы она не перезаписывала предыдущую запись ( игнорируйте запись, в которой уже есть время, записанное в ячейке), что было бы здорово.

Я уже пытался отсортировать его в новую вкладку, используя 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 ]

1 голос
/ 05 июля 2019

Просматривая «значения», вы можете перейти вверх / назад, чтобы сначала найти более новые записи (при условии, что новые находятся внизу):

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

К вашему другому вопросу о том, как проверитьесли ячейка в столбце 8 пуста, вы можете попробовать это:

  if (values[i][0] == id && values[i][7] == "") {
0 голосов
/ 05 июля 2019

Хорошим решением для вашего сценария будет реализация вспомогательной переменной 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);
      }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...