2017-09-06 62 views
-1

我有一个Google表格(KWTT) - 其中,数据使用默认的过滤器视图进行过滤。而且,在同一份文件的另一张表格上,我正在尝试调用过滤信息的一部分。但是,它拉动绝对的行信息,而不是过滤的信息。Google表格,查询已过滤的数据行

=KWTT!A3 

这是我使用的第二片材,以检索与所述第一片材(KWTT)数据的公式。但是,当我使用默认过滤器视图时,顶行将交换到A121

How do I always retrieve the top row of the filtered data in the first sheet to the second sheet?

如何始终检索第一片的第二片过滤数据的顶行?

+0

您需要一个谷歌应用程序脚本 –

+0

@anonymous我很感激反馈意见,但这并不能帮助我解决问题。我在寻找教育,而不是显而易见的。 –

+0

显然我没有提供它作为解决方案,而是作为评论。 –

回答

-1

有人可能会想出一个JS解决方案。但是,下面是一个带有帮助列的Roundabout公式列表,仅用于查找顶行。也许可以用相同的方式找到其他过滤的行。但我不打算在此解释所有这些,因为OP在第一行中是明确的,并且在其原始公式第二表中仅使用A3,表示单个条目。

助手柱J1在KWTT:

=ARRAYFORMULA(ROW(J1:J1000)) 

在片2

=Indirect ("KWTT!A:"&SUBTOTAL(105,KWTT!J1:J1000)) 

我们使用SUBTOTAL其中跳过过滤的行来获得最小的可见光范围内的,这将被馈送到INDIRECT

=INDEX(KWTT!A1:I1000,SUBTOTAL(105,KWTT!J1:J1000)) 

然而,这个设置仍对如此多的理由弱:

整行可以通过提起。我宁愿选择FILTERQUERY直接过滤给定的数组。

=QUERY(KWTT!A1:I1000,"Select * where A contains 'anime'",1) 
0

这似乎很麻烦,但这会做到这一点。您可能需要更改ssID和工作表名称。

function copyFilteredData1Row() { 
    var hiddenRows = [];//A 1d array of hidden rows. 
    var ssId="1u94OL_HMszOkvvyXdci-SEq7NO0KUJiD1t0xUqHvCMw"//Spreadsheet ID 
    var sheetId="0" //Sheet ID 
    // limit what's returned from the API 
    var fields = 
"sheets(data(rowMetadata(hiddenByFilter)),properties/sheetId)"; 
    var sheets = Sheets.Spreadsheets.get(ssId, {fields: fields}).sheets; 
    for (var i = 0; i < sheets.length; i++) { 
     if (sheets[i].properties.sheetId == sheetId) { 
      var data = sheets[i].data; 
      var rows = data[0].rowMetadata; 
     for (var j = 0; j < rows.length; j++) { 
      if (rows[j].hiddenByFilter) hiddenRows.push(j)} 
    }} 

    var ss=SpreadsheetApp.getActiveSpreadsheet() 
    var s=ss.getSheetByName("Sheet1")//filtered sheet 
    var s1=ss.getSheetByName("Sheet2")//Copy to sheet 
    var lr1=s1.getLastRow() 
    var lc1=s1.getLastColumn() 
    var lr=s.getLastRow() 
    var lc=s.getLastColumn() 
    var data1=s.getRange(1,1,lr,lc).getValues()//get all data from filtered sheet. 

    var nonHiddenRows=[]//Array of non hidden data. 

    for (var i = 1; i <data1.length ; i++) { 
    var count=0 
    var row = i 
    for(var k=0;k<hiddenRows.length;k++){ 
     var hrow=hiddenRows[k] 
    if(row!=hrow){ 
     count=count+1} 
    } 
     if(count==hiddenRows.length){ 
     nonHiddenRows.push(data1[i]) 
     if(nonHiddenRows.length==1){break} 
     } 
    } 
    if(s1.getRange(1, 1, 1, 1).getValue()!=""){s1.getRange(1, 1, lr1, 
lc1).clearContent()}//Clear old filtered data. 
    s1.getRange(1, 1, nonHiddenRows.length, 
nonHiddenRows[0].length).setValues(nonHiddenRows) 
    }