Получить первую строку, где ColA = Name, ColB = SecondName и ColC = null (пусто) - PullRequest
0 голосов
/ 10 мая 2019

Я очень плохо знаком с JavaScript, так что терпите меня.Я хочу уравнение, которое ищет несколько столбцов для указанных значений, а не одно и то же значение во всех столбцах.Например: ColA = Джеймс, ColB = Смит, ColE = "" (cellisempty) верно?Как только он находит первую строку с этими критериями, он получает эту строку для использования в другом уравнении, которое будет setValue(ColE + gotRow, new Date()) Я делаю Лист времени / времени, если вам интересно.Идея заключается в том, что функция ищет имя человека и следующее доступное место для размещения времени, поскольку один и тот же человек мог выходить из системы и несколько раз на одном листе.Как только у него есть строка с пустым местом, он помещает ее в текущее время в эту строку, что делает ее больше не пустой, то есть при следующем запуске функции она пропустит эту строку и перейдет к следующей, из которой парень вышел из системы.

вот функция, которую мне дали для решения моей проблемы благодаря одному из пользователей.

function getValue(cellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).getValue()
}

function setValue(cellName, value) {
  SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(value);
}

function rowWhereTwoColumnsEqual(value1,col1,value2,col2) {
  var value1=value1;//testing
  var value2=value2;
  var col1=col1;//testing
  var col2=col2;//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);
    }
  }
  Logger.log(rA.push(i+1))
  SpreadsheetApp.getUi().alert(rA.join(','));
}

Я создал функцию под ней, просто для ввода значений, чтобы увидеть, как она работает

function getrowWhereTwoColumnsEqual(){
 rowWhereTwoColumnsEqual('James','Sheet1!A',null,'Sheet1!C')
Logger.log(rowWhereTwoColumnsEqual('Ta','Sheet1!A',null,'Sheet1!C'))
}

Изготовленный мной лист имеет 'James' в A1, а C1 пуст.У этого также есть 5 других рядов, полных случайных имен.

Column A | Column B  | Column C
=================================
James    |     C     | 
Kyle     |     E     | 
Micheal  |     T     | 
Sarah    |     K     |
Tray     |     F     | 
John     |     D     | 

Так что я ожидал получить ответ «1», потому что строка 1 должна быть истинной для обоих, но вместо этого я увидел «7».Возможно, потому что строка 7 пуста во всех столбцах, поэтому все столбцы равны.Поэтому я должен был ввести неправильные значения, иначе уравнение нуждается в корректировке.Как я уже сказал, я очень новый.Изменить 9/9/19 20:06 Еще раз спасибо Купер.Ваша функция работает довольно хорошо.

function test() {
  findRows(1,getValue('A1'),2,getValue('B1'),3,null,'Sheet1')
  Logger.log(findRows(1,getValue('A1'),2,getValue('B1'),3,null,'Sheet1'));
}

Однако, как только я добавил значения в C1, logger.log вышел []

Column A | Column B  | Column C
=================================
James    |     C     | 5/9/19
Kyle     |     E     | 
James    |     T     | 
Sarah    |     K     |
James    |     F     | 
John     |     D     | 

без значения, я получил [1.0,3.0, 5.0], но как только я изменил полученное значение, [] ожидал [3.0,5.0]

Редактировать 9:00 по тихоокеанскому времени. Я изменил ноль на "", и, похоже, он работает.

Редактировать 9:25 PST Функция конечных уравнений Test () - это тот, который был готовым продуктом и успешно завершен.

function getValue(cellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).getValue()
}

function getValues(cellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).getValues()
}
function setValue(cellName, value) {
  SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(value);
}

function findRows(c1,n1,c2,n2,c3,n3,name) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName(name);
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rA=[];
  for(var i=0;i<vA.length;i++) {
    if(vA[i][c1-1]==n1 && vA[i][c2-1]==n2 && vA[i][c3-1]==n3) {
      rA.push(i+1);
    }
  }
  return rA
}

function test() {
  var passiveRow = findRows(1,getValue('A2'),2,getValue('B2'),3,"",'Sheet1');
  Logger.log(passiveRow);
  setValue('C' + passiveRow, new Date().toLocaleString());
}

Чтобы "" работал, строка 1 должна иметь заголовок.Это работает, только если есть только 1 результат, который должен быть в конце.он находит имя и пустое место, чтобы поставить дату.

1 Ответ

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

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

c1, c2 и c3 - номер столбца n1, n2 и n3 - значения, либо строки, либо значение null, а name - имя листа.

function findRows(c1,n1,c2,n2,c3,n3,name) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName(name);
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rA=[];
  for(var i=0;i<vA.length;i++) {
    if(vA[i][c1-1]==n1 && vA[i][c2-1]==n2 && vA[i][c3-1]==n3) {
      rA.push(i+1);
    }
  }
  return rA
}

function test() {
  Logger.log(findRows(1,10,2,2,3,null,'Sheet150'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...