2016-04-22 12 views
1

FILTER()関数のような条件を引数として受け入れるカスタム関数を作成したいと思います。 :Googleスプレッドシートのカスタム関数の引数として渡された条件を評価します

LARGEST_STREAK(Data, Winnings > 0) 
LARGEST_STREAK(Data, Winnings > 0, Sports = "Football") 

(データ、Winnings and Sportsは名前付き範囲です)。

これを行う関数の例がありますか?最高ののはFILTER()関数のソースコードですが、私はbuit-in関数のためにJavascriptが実行されているかどうかもわかりません。

答えて

1

カスタム関数が受け取る引数は、範囲ではなく、JavaScript値またはダブル配列です。たとえば、customfunction(A1:A3, B2:D2)は、引数[[x], [y], [z]][[x,y,z]]を受け取ります。ここで、x、y、zは、これらのセルに格納されている値です。

特に、配列はブール値の配列で、JavaScriptの独自のfilterメソッドで使用できます。ここでは、カスタム関数としてFILTER関数の再実装です:

function myFilter(arr, conditions) { 
    if (conditions.length == 1) { 
    return arr.map(function (row) { 
     return row.filter(function (_, i) { 
     return conditions[0][i]; 
     }); 
    }); 
    } 
    else { 
    return arr.filter(function (_, i) { 
     return conditions[i][0]; 
    }); 
    } 
} 

の比較でこれを使用するには、arrayformulaラッパーが必要になります。

=arrayformula(myfilter(A1:C10, D1:D10 > 5)) 

理由は返しD1:D10 > 5ラッパー、なしということですD1 > 5と同じです。組み込みのFILTER関数は、配列と連動する関数として既に知られているので、ラッパーのような必要はありません。

+0

「conditions.length == 1」スコープが使用されているかどうかはわかりません。 また、複数の条件についてはどうでしょうか、条件配列はどのように見えますか? – sylr

+1

フィルタの条件の配列は、行または列のいずれか1次元でなければなりません。長さ== 1は行を表し、[[[x、y、z]] 'となります。そうでなければ、列['[x]、[y]、[z]]'です。複数の条件があった場合は、 'return conditions [0] [i] && moreConditions [0] [i];' ... –

関連する問題