2015-02-26 2 views
2

У меня есть форма выписки, которую я хочу узнать, какие из них используются только с формулами.Как использовать фильтр внутри формулы массива?

Мой мыслительный процесс заключается в том, чтобы найти номер строки последнего экземпляра каждой метки, а если номер строки «out» выше, чем номер строки «in», тогда устройство в настоящее время проверяется.

Timestamp Student  Name Check out Chromebook Check in Chromebook 
2/26/2015 10:33:48 Bjorn Spare1-01 
2/26/2015 10:33:59 Fred Spare1-02 
2/26/2015 10:34:16 Bjorn       Spare1-01 
2/26/2015 10:34:39 Conor Spare1-03 
2/26/2015 11:57:31 Conor Spare1-01 
2/26/2015 11:57:49 Fred       Spare1-02 
2/26/2015 11:57:59 Bjorn Spare1-02 

Я могу найти выяснить, все запасные части, которые были проверены с помощью: =sort(UNIQUE(C2:C))

Я был в состоянии найти номер строки последнего экземпляра каждого использования: =max(filter(row(C:C),C:C=F2)) (мой сорт уникальный функция находится в столбце F).

Я хотел бы получить формулу последней строки для работы с формулой array, чтобы мне не пришлось полагаться на ручное перетаскивание формулы вниз.

Например, мне бы хотелось, чтобы это сработало: =arrayformula(max(filter(row(C:C),C:C=F:F))) обратите внимание на добавление arrayformula и изменение от F: 2 до F: F.

Я не совсем уверен, почему, но я получаю результат 1000.

Edit: Мой ожидаемый результат будет «Последняя выписка строка».

Out Unique Last checkout row 
Spare1-01 6 
Spare1-02 8 
Spare1-03 5 

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

Вот ссылка на документ, который я играю с: https://docs.google.com/spreadsheets/d/1jC0RPxUZSt7BCHRQI5vBXvoANbQlu9CjDNr2VV-MOOI/edit?usp=sharing

Edit (конечная формула используется) (я не могу не поблагодарить @JVP достаточно для помощи с этим):

=ArrayFormula(if(vlookup(unique(filter(C2:C, len(C2:C))), sort({C2:C, A2:B, row(A2:A)},4,0), 4, 0) > iferror(vlookup(unique(filter(C2:C, len(C2:C))), sort({D2:D, A2:B, row(A2:A)},4,0),4,0),0), vlookup(unique(filter(C2:C, len(C2:C))), sort({C2:C, A2:C, row(A2:A)},5,0), {2,4,3}, 0),)) 
+0

Вот почему я получаю 1000, но я до сих пор не знаю, почему это не логически работает. –

+0

Я хочу, чтобы эта формула работала: = arrayformula (max (фильтр (строка (C: C), C: C = F: F))) –

+1

pnuts, я отредактировал свое последнее сообщение, чтобы включить нужный результат. Я могу получить его с помощью max (filter (row formula и copy that down), но я хотел бы, чтобы он был частью массива, чтобы он был более динамичным. –

ответ

3

для нужного вывода (включая имена), попробуйте:

=ArrayFormula({unique(filter(C2:C, len(C2:C))), vlookup(unique(filter(C2:C, len(C2:C))), sort({C2:C, A2:B, row(A2:A)},4,0), 4, 0)}) 

После вашего мыслительного процесса (в конечном счете, вы хотите увидеть, если устройство в данный момент проверяется или, верно?), попробуйте:

=ArrayFormula({unique(filter(C2:C, len(C2:C))), if(vlookup(unique(filter(C2:C, len(C2:C))), sort({C2:C, A2:B, row(A2:A)},4,0), 4, 0) > iferror(vlookup(unique(filter(C2:C, len(C2:C))), sort({D2:D, A2:B, row(A2:A)},4,0),4,0),0), "checked out", "checked in")}) 

Example sheet with last formula in F2

+1

@pnuts: вы должны увидеть список с уникальными данными и их текущим статусом: вышли или зарегистрировались. Проверьте лист, который я добавил к моему ответу. – JPV

+1

Просто моя интерпретация того, что пытается попытаться выполнить. Так что никаких гарантий ... ;-) – JPV

+0

Огромное вам спасибо –

0

Спасибо @JPV Вот окончательная формула, которую я использовал, я изменил вещи вокруг так, что все, что я должен был сделать войти в номер столбца и номер столбца out:

=sort(ArrayFormula(if(vlookup(unique(filter(INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE), len(INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE)))), sort({INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE),row('Form Responses 1'!A2:A)},2,0), 2, 0) > iferror(vlookup(unique(filter(INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE), len(INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE)))), sort({INDIRECT("'Form Responses 1'!"&"R2C5:C5", FALSE),row('Form Responses 1'!A2:A)},2,0), 2, 0),0), vlookup(unique(filter(INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE), len(INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE)))), sort({INDIRECT("'Form Responses 1'!"&"R2C4:C4", FALSE), row('Form Responses 1'!A2:A), INDIRECT("'Form Responses 1'!"&"R2C1:C"&COUNTA('Form Responses 1'!1:1)&"", FALSE)},2,0), {3,4,6}, 0),))) 

Я программирую создание сценария, и вот код.

function createReportSheet(setName) { 
    if (!setName){setName = "Items"}; 
    var destId = FormApp.getActiveForm().getDestinationId(); 
    var as = SpreadsheetApp.openById(destId); 
    try{ 
    var sheet = as.insertSheet("Report Out: "+setName); 
    } catch(err){ 
    var sheet = as.getSheetByName("Report Out: "+setName); 
    sheet.clear(); 
    } 


    //build formula 
    var formSheetName = "'Form Responses 1'!"; 
    var colOut = 4; 
    var colIn = 5; 
    var colToShow = "3,4,6"; // A=3, B=4, C=5, .. 

    var frTimeStamp = formSheetName+"A2:A"; 
    var lastCol = "&COUNTA("+formSheetName+"1:1)&"; 

    var frSort = 'INDIRECT("'+formSheetName+'"&"R2C'+1+':C"'+lastCol+'"", FALSE)'; 
    var frIn = 'INDIRECT("'+formSheetName+'"&"R2C'+colIn+':C'+colIn+'", FALSE)'; 
    var frOut = 'INDIRECT("'+formSheetName+'"&"R2C'+colOut+':C'+colOut+'", FALSE)'; 

    //break into parts 
    var f_unique = "unique(filter("+frOut+", len("+frOut+")))"; 
    var f_sortIn = "sort({"+frOut+",row("+frTimeStamp+")},"+2+",0)"; 
    var f_vlookupIn = "vlookup("+f_unique+", "+f_sortIn+", "+2+", 0)"; 
    var f_sortOut = "sort({"+frIn+",row("+frTimeStamp+")},"+2+",0)"; 
    var f_vlookupOut = "vlookup("+f_unique+", "+f_sortOut+", "+2+", 0)"; 
    var f_sortDisp = "sort({"+frOut+", row("+frTimeStamp+"), "+frSort+"},"+2+",0)"; 
    var f_vlookupDisp = "vlookup("+f_unique+", "+f_sortDisp+", {"+colToShow+"}, 0)"; 
    var formula1 = "ArrayFormula(if("+f_vlookupIn+" > iferror("+f_vlookupOut+",0), "+f_vlookupDisp+",))"; 
    var formula = "=sort("+formula1+")"; 

    // put formula into sheet 
    sheet.getRange(2, 1).setFormula(formula); 
    sheet.getRange("a:a").setNumberFormat("mm/dd/yy h:mm:s"); 

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