2013-09-08 7 views
0

Следующая формула позволяет долго работать.Формула электронных таблиц, которая слишком долго запускается - скрипт советует

= TRANSPOSE (
    IFERROR (
     INDEX (
     FILTER(Students!B:B; 
     REGEXMATCH(Students!B:B; C50), 
     REGEXMATCH(Students!B:B; B50), 
     REGEXMATCH(Students!C:C; F50) 
     ));"NO MATCH" 
)) 

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

Благодаря T

+0

Это не приложение сценария. Формулы его электронных таблиц. Поместите правильные метки. –

+1

Я пытаюсь понять, как преобразовать форму электронной таблицы в пользовательский скрипт google. – user41592

+0

Предоставьте больше объяснений тому, что он делает. Сценарий будет медленнее, чем формула, если вы его кодируете с использованием того же алгоритма. Возможно, вам придется менять стратегии. –

ответ

1

Вот пользовательская функция, которая может заменить формулу, которую вы используете. Например:

=listStudents(C50,B50,F50) 

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

Код:

/** 
* Custom spreadsheet function to produce a list of names of 
* students that match the given criteria. 
*/ 
function listStudents(givenName, surname, employer) { 
    var matches = []; // matching students will be placed in this array 
    var HEADERS = 1; // # rows of header info at top of sheet 
    var FULLNAME = 1; // Column containing full names (B) 
    var EMPLOYER = 2; //     employers (C) 

    // Array filter function - returns true if conditions match 
    function test4match(row) { 
    return (row[FULLNAME].indexOf(givenName) !== -1 && 
      row[FULLNAME].indexOf(surname) !== -1 && 
      row[EMPLOYER].indexOf(employer) !== -1) 
    } 

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Students'); 
    var range = sheet.getDataRange(); 
    var data = range.getValues().slice(HEADERS); // All data from sheet, without headers 

    var filteredData = data.filter(test4match); // Get matching rows 
    for (var i=0; i<filteredData.length; i++) { 
    matches.push(filteredData[i][FULLNAME]); // Then produce list of names 
    } 

    return [matches]; // Return a 2-d array, one row 
} 
+0

Спасибо! Позвольте мне с этим поработать. Добавление пункта меню - действительно хорошая идея. – user41592

Смежные вопросы