Google sheets 如何在数组公式中使用筛选器?

Google sheets 如何在数组公式中使用筛选器?,google-sheets,gs-vlookup,Google Sheets,Gs Vlookup,我有一张签出表,我想用公式找出哪些是签出的 我的思考过程是找到每个标签的最后一个实例的行号,如果“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

我有一张签出表,我想用公式找出哪些是签出的

我的思考过程是找到每个标签的最后一个实例的行号,如果“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))
找到每个实例的最后一个实例的行号(我的sort unique函数位于第F列)

我想让我的最后一行公式与arrayformula一起工作,这样我就不必依靠手动向下拖动公式

例如,我希望这样做:
=arrayformula(max(filter(行(C:C),C:C=F:F))
注意arrayformula的添加以及从F:2到F:F的更改

我不太清楚为什么,但我得到的结果是1000

编辑:我的预期输出将是“最后一个签出行”

如果我能找到将其添加到数组公式中的方法,我还想找到一种方法来放入排序(unique函数,使其成为一个单独的公式,我在列编号中输入,它会吐出每个唯一项的最后一行编号)

以下是我正在使用的文档的链接:

编辑(使用最终公式)(我非常感谢@JVP在这方面的帮助):

要获得所需的输出(包括名称),请尝试:

按照您的思考过程(最终您希望查看设备当前是否签入或签出,对吗?),尝试:


谢谢@JPV这是我使用的最后一个公式,我改变了做法,只需输入输入输入列的编号和输出列的编号:

=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");

}

这就是我得到1000的原因,但我仍然不知道为什么它在逻辑上不起作用。我希望这个公式起作用:=arrayformula(max(filter(row(C:C),C:C=F:F)))pnuts,我编辑了我的上一篇文章以包含所需的输出。我可以使用max(过滤器)获取它(行公式并将其复制下来,但我希望将其作为数组公式的一部分,以便使其更具动态性。@pnuts:您应该看到带有唯一性的列表及其当前状态:签出或签入。请查看我添加到答案中的工作表。。仅是我对OP尝试实现的内容的解释。因此,不保证…;-)我正试图打破这个局面。你认为{}数组中的do formula do。我在文档中找不到它。@JVP,我真的很努力地自己做这件事,但我无法找出对公式的更改以使其生效。我的目标是只显示已出的Chromebook,以及相应的时间戳和名称。@BjornBehrendt。在示例表中,我添加了一个公式II2(虽然还没有完全测试过)。看看它是否适合你。用{}来构造一个文字数组。一些简单的例子见表2。我希望这有帮助吗?
=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")})
=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");

}