Google scripts поиск электронных таблиц по столбцам, возврат строк


Я пытаюсь найти лучший сценарий с точки зрения времени выполнения для выполнения задачи. У меня есть прилично большая электронная таблица, где мне нужно проверить значения в определенных известных Столбцах, и в зависимости от случая совпадения она возвращает эту строку. В идеале мне нужна новая электронная таблица, содержащая возвращенные строки.

У меня есть электронная таблица, открытая ID, и у меня есть sheet & range, но не уверен, что самый эффективный способ поиска по конкретным столбцам и захвата не только этого значения, но и всего ряд.

Спасибо,

3 10

3 ответа:

Вы можете использовать приведенный ниже код для поиска в определенном столбце. Код не требует пояснений.

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [ {name: "Search", functionName: "onSearch"} ];
  ss.addMenu("Commands", menuEntries);    
}

function onSearch()
{
    var searchString = "Test11";
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SheetName"); 
    var column =4; //column Index   
    var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
    var searchResult = columnValues.findIndex(searchString); //Row Index - 2

    if(searchResult != -1)
    {
        //searchResult + 2 is row index.
        SpreadsheetApp.getActiveSpreadsheet().setActiveRange(sheet.getRange(searchResult + 2, 1))
    }
}

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;
} 

Мой скрипт поиска на GitHub

Обычаи:

Lookup_(SheetinfoArray,"Sheet1!A:B",0,[1],"Sheet1!I1","n","y","n");

Lookup_(Sheetinfo,"Sheet1!A:B",0,[1],"return","n","n","y");

Lookup_(SheetinfoArray,"Sheet1!A:B",0,[0,1],"return","n","n","y");

Lookup_(Sheetinfo,"Sheet1!A:B",1,[1,3,0,2],"return","y","n","n");

Lookup_("female","Sheet1!A:G",4,[2],"Database!A1","y","y","y");

Lookup_(Sheetinfo,LocationsArr,4,[0],"return","y","n","y");

Lookup_(/RegEx+/i,LocationsArr,4,[0],"return","y","n","y");

///////////////////////////////////////////////////////

Пояснение Параметров:

- "Search_Key" - может быть строкой, массивом или регулярным выражением для поиска нескольких объектов одновременно

- "RefSheetRange" - справочный источник информации. Может быть локальная ссылка листа и диапазон или массив данных из переменной.

- "SearchKey_RefMatch_IndexOffSet" - какой столбец информации вы ссылаетесь из 'Search_Key' на данные 'RefSheetRange'.

- "IndexOffSetForReturn" - после того, как было найдено соответствие 'Search_Key', какие столбцы данных будут возвращены из 'RefSheetRange'.

- "SetSheetRange" - куда вы собираетесь поместить выбранную информацию из 'RefSheetRange', которая соответствует 'Search_Key' или вы можете использовать 'return' и когда функция завершает он будет возвращен, так что вы можете вывести функцию в переменную.

- "ReturnMultiResults" - если 'Y' говорит, что 'Search_Key' - это 'NW', и вы хотите найти каждый магазин в цепочке, которая попадает под Северо-Запад в вашем наборе данных. Таким образом, объявление " Y " не остановится после того, как он найдет первое совпадение, он будет продолжать искать через остальные данные.

- "Add_Note" - если 'Y' вы устанавливаете результаты в электронную таблицу и не возвращаете ее в память, то он установит первую ячейку в таблице. "SetSheetRange" с пометкой что и когда.

- "Has_NAs" - если 'Y' он поместит в '#N/A' столбец, где он не нашел данные для 'Search_Key', то он оставит столбец пустым.

function onSearch()
{
    var searchString = "SD0023";
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); 
    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

    if(searchResult != -1)
    {
        //searchResult + 2 is row index.
        SpreadsheetApp.getActiveSpreadsheet().setActiveRange(sheet.getRange(searchResult + 2, 3)).setValue("found here");
    }
}

Array.prototype.findIndex = function(search){
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if (this[i].toString().indexOf(search) > -1 ) return i;

  return -1;
} 

Внес некоторые небольшие изменения в ответ для поиска встроенного текста.