Как получить строку, где два столбца равны определенным значениям - PullRequest
0 голосов
/ 09 мая 2019

Я очень новичок, и я пытаюсь создать лист Time in / Time out.У меня есть 2 отдельных листа, во-первых (ACTIVE), где происходит триггер, который запускает сценарий onEdit (e).Все функции, которые запускаются onEdit (e), влияют на второй лист (PASSIVE), чтобы заполнить столбцы A (Фамилия), B (Имя), C (Местоположение), D (Время ожидания).Я закончил создание функций Time out, получив значения A, B, C + Active Row (это не код).Триггер всегда находится в той же строке, что и копируемые значения, поэтому он был относительно простым.На листе PASSIVE у меня есть все значения, которые хранятся с использованием кода, который кто-то создал, называется addRecord, где он получает последнюю строку + 1 листа PASSIVE и устанавливает значения, извлеченные из листа ACTIVE, и подключает их. Таким образом, он добавляет записи, не перезаписывая ничего,Работает красиво.Однако сделать функцию «время в» было сложно.E (Time In) Моя идея состоит в том, чтобы получить строку PASSIVE, выполнив поиск PASSIVE! A для значения, полученного из (ACTIVE! A + Active Row), как только он найдет совпадение, он обнаружит, (PASSIVE! E + совпадающая строка)пустой.Если это так, он добавляет новый. Дата и заканчивается.Если он не пустой, он игнорирует эту строку и продолжает поиск следующей строки, которая имеет PASSIVE! A, совпадающую с захваченным значением.Как только он найдет эту строку, getRow.setValue из (PASSIVE! E + захваченная строка, новая дата ())

В сети я нашел функцию, чтобы найти первую строку, которая сопоставляет ACTIVE! A с PASSIVE! A.Но он продолжал переписывать дату первого матча.Он никогда не игнорировал строку с непустой ячейкой для следующей строки совпадения.Возможно, я был немного не в себе, поэтому я прошу много подробностей и объяснений в Ответах.Это был код, который я использовал из другого ответа.

function getCurrentRow() {
  var currentRow = SpreadsheetApp.getActiveSheet().getActiveSelection().getRowIndex();
  return currentRow;
}
function onSearch1()
{

Что я добавил

  var row = getCurrentRow();
  var activeLocation = getValue('ACTIVE!A' + row);

Продолжение Другой код

 var searchString = activeLocation;
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PASSIVE"); 
    var column =1; //column Index   
    var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
  var searchResult = columnValues.findIndex(searchString); //Row Index - 2

Что я добавил

 setValue(PASSIVE!E + searchResult, new Date().toLocaleString())

Это сработало, если у всех естьдругое имя, но результат поиска всегда находил первую строку совпадения, я пытался добавить if ACTIVE! A == PASSIVE! A && PASSIVE! E == "", grabRow (я знаю, что это неправильный код)Но я даже не знал, куда поместить эту функцию, если она будет работать, или она будет работать, или будет продолжать выдавать значение false после запуска в первый раз true.

Продолжение Другой код

if(searchResult != -1)
    {
        //searchResult + 2 is row index.
        SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PASSIVE").setActiveRange(sheet.getRange(searchResult + 2, 1))
    }
   if(searchResult = searchResult2) {
    setValue('PASSIVE!E' + searchResult, new Date().toLocaleString())
  }
}
Array.prototype.findIndex = function(search){
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if(this[i] == search) return i;

  return -1;
}

Так вот, что я использовал, но не уверен, что это правильный путь.Каждый раз, когда я использовал его, он устанавливал бы только для SearchResult первую найденную строку, в которой была бы строка поиска, которую я бы на самом деле предпочел, если бы она нашла последнюю строку, учитывая, что запись добавления со временем завершается, и вход в систему должен быть самым последнимназвание.Но я предполагаю, что если я смогу просто получить функцию, которая ищет диапазон и находит строку для двух значений в определенных столбцах, тогда я могу просто setValue('PASSIVE!E' + foundRow, new Date().toLocaleString())

Редактировать 09.05.2009 17:34 PSTСпасибо тем, кто отвечает.Я расширяю этот вопрос.

function rowWhereTwoColumnsEqual(value1,col1,value2,col2) {
 var value1=value1 || 'A1';//testing
 var value2=value2 || "";

Идея, которую я имею, состоит в том, чтобы искать в столбце 1 другого листа, скажем, «SheetA1» (первый лист).И столбец 3 другого листа для "" (cellisempty).

var value1= 'Sheet1!A1';
 var value2= "";
 var col1='Sheet2!A';
 var col2='Sheet2!C';
 var ss=SpreadsheetApp.getActive();
 var sh=ss.getSheetByName('Sheet2');
 var rg=sh.getDataRange();
 var vA=rg.getValues();

Однако я не знаю, как работает ВА.Я также хочу получить getRow () строки, которая используется для использования этого числа в другой функции.

1 Ответ

0 голосов
/ 10 мая 2019

Попробуйте это:

function rowWhereTwoColumnsEqual(value1,col1,value2,col2) {
  var value1=value1 || 9;//testing
  var value2=value2 || 8;
  var col1=col1 || 1;//testing
  var col2=col2 || 2;//testing
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rA=[];
  for(var i=0;i<vA.length;i++) {
    if(vA[i][col1-1]==value1 && vA[i][col2-1]==value2) {
      rA.push(i+1);
    }
  }
  SpreadsheetApp.getUi().alert(rA.join(','));
  //return rA;//as an array
  //return rA.join(',');//as a string
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...