Я очень новичок, и я пытаюсь создать лист 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 () строки, которая используется для использования этого числа в другой функции.