2016-02-19 34 views
2

tl; dr:如何讓兩個範圍作爲函數的參數出現?例如,我想看看在E列的每一個細胞,除了 E5:
=MY_FUNCTION(somehowjoin(E1:E4, E6:E))在Google表格中連接兩個範圍

背景
我寫在谷歌表項目跟蹤器,如微軟項目。我有一個custom function in Google Sheets,讓我通過看的,它取決於所有任務的最大結束日期來計算各種任務的開始日期:

=MAX_LOOKUP(G9, A:A, I:I) 

然而,此任務的結束日期,然後計算依據開始日期和結束日期位於列中,幷包含所有結束日期。因此,我有一個循環依賴。 enter image description here

所以,我想我寫公式,每行超過當前條跳躍,如:

=MAX_LOOKUP(G9, A1:A8 + A10:A, I1:I8 + I10:I) 

FWIW我目前的解決辦法是重新編寫自定義函數的簽名像這樣:

=MAX_LOOKUP_SKIPROW(G9, ROW(), "A", "I") 

和手動構建塔內的兩個範圍採用t函數:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
var keys1 = sheet.getRange(keyCol+"1:"+keyCol+(skipRow-1)).getValues(); 
var vals1 = sheet.getRange(valCol+"1:"+valCol+(skipRow-1)).getValues(); 

var keys2 = sheet.getRange(keyCol+(skipRow+1)+":"+keyCol).getValues(); 
var vals2 = sheet.getRange(valCol+(skipRow+1)+":"+valCol).getValues(); 

這是一個功能性的解決方案,但使功能更特殊的目的。我不認爲這是對這個更加普遍的加入範圍問題的「回答」。

+0

我寧願不重寫我的自定義函數接受多個參數,不過當然這是一個潛在可能。 – Phrogz

+0

我認爲'indirect()'和'row()'的組合可以幫助您構造排除當前行的範圍。沒有? – Marc

+0

@Marc據我所知,並不是一個單一的論點。我錯了嗎?對於不連續的範圍是否有A1或R1C1語法? – Phrogz

回答

2

簡短的回答

創建自己的陣列,並以此作爲您的自定義函數的參數。

說明

在谷歌表中,用戶可以通過擁抱它們的元素在括號中建立自己的陣列。

而不是

=MY_FUNCTION(somehowjoin(E1:E4, E6:E)) 

使用

=MY_FUNCTION({E1:E4;E6:E}) 

參考

Using arrays in Google Sheets - Google docs editors Help

+0

謝謝!這正是我希望能夠實現的:一種簡單的內置語法,它連接了不連續的範圍。 – Phrogz

0

當您將範圍傳遞給Google表格中的自定義函數時,範圍將以數組數組的形式出現。這是一個真正的陣列,只要Array.isArray()返回true

武裝與知識,你可以創建自己的自定義函數:

function UNION(range1,range2){ 
    return range1.concat(range2); 
} 

,然後簡單地:

=MY_FUNCTION(UNION(E1:E4, E6:E)) 

...和你原來的功能不會有任何想法,這是經營在已經合併的不連續範圍上。

+0

的副本我堅信希望有一種更加標準的方法來加入範圍,而不訴諸自定義函數。直到很明顯沒有更好的選擇是可能的,我不會接受這個答案。 – Phrogz

1

我不完全理解你正在嘗試做什麼,但這可能有幫助。您可以加入如下所示的範圍。前兩個將數據返回到一行或一列。我將這些包含在內,以便您可以看到發生了什麼。第三次我在測試中使用,以確保數據可以發送到自定義公式。我希望這有助於:

=split(join(",",A2:A6,A8:A12),",",true) 

=transpose(split(join(",",A2:A6,A8:A12),",",true)) 

=MAX_LOOKUP(G9, split(join(",",A1:A8,A10:A),",",true),split(join(",",I1:I8,I10:I),",",true))