2016-11-25 8 views
1

私は、INDEX関数内で全く同じFILTER関数を2回使用するスプレッドシート式を持っています。自分自身を繰り返すことを避ける方法はありますか、そして/または簡単な表現のバージョンはありますか?スプレッドシートでの繰り返しの回避方法= INDEX(FILTER()、FILTER())式ですか?

式は(余分な明確性のほんの少しのために複数の行に分割)次のようになります。

=INDEX( FILTER($A$1:$P$1, ($A$1:$P$1 = "ANIM")+($A$1:$P$1 = "COMP")+($A$1:$P$1 = "SENT TO EDIT"), NOT (ISBLANK(A2:P2))), COLUMNS( FILTER($A$1:$P$1, ($A$1:$P$1 = "ANIM")+($A$1:$P$1 = "COMP")+($A$1:$P$1 = "SENT TO EDIT"), NOT (ISBLANK(A2:P2)))))

どう表現がないこと行の右端の非空白列の見出しを返すです列が「ANIM」、「COMP」、または「SENT TO EDIT」のいずれかであるかぎりです。

は、このGoogleスプレッドシートの列Qにアクションで式を参照してください。

https://docs.google.com/spreadsheets/d/1JCwmv2Bkz4v4_0wbM07IxcUtqCfm2242p0IVbex-I5c/edit?usp=sharing

FILTER機能はまったく同じ両方の時間ですので、私は変数を使用することができれば、それは書き換えることができ

range1 = FILTER(.....); INDEX(range1、COLUMNS(range1));

FILTER式の繰り返しを避けるために、そのようなやり方をする方法はありますか?

答えて

0

あなたは正しいアイデアを持っています。長いサブ式を繰り返さないようにするには、それらを数式の外に移動して結果をいくらか呼び出すことです。場合によっては、結果を表示する範囲への参照を使用することもできますが、動的配列を返す式では、カスタム関数を使用する方が良い方法です。

例:

レッツは、以下の

=でそれを付加することを忘れないでください)あなたはdry!A1

FILTER($A$1:$P$1, ($A$1:$P$1 = "ANIM")+($A$1:$P$1 = "COMP")+($A$1:$P$1 = "SENT TO EDIT"), 
NOT (ISBLANK(A2:P2))) 

を動かすと言うだけで "MCVE" です。

=INDEX(headers(dry!A1:P1),COLUMNS(headers(dry!A1:P1)) 

注:以下のためにあなたの元の式を置き換え

function headers(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets().getSheeyByName('dry'); 
    return sheet.getDataRange().getValues(); 
} 

:それは、TE乾燥シートのみ上記の式が含まれていることを前提として!ドライA1の使用:ヘッダの引数としてP1を()その部分式の結果が変わるたびに再計算を強制することです。

も参照してください:あなたはこのような何かを試みることができるIs there a way to evaluate a formula that is stored in a cell?

+0

私は外部機能を避けることを望んでいました。この特定のケースでは、私は機能を使用するよりもむしろ自分自身を繰り返すと思います。 :-) –

+0

結果の配列のサイズが常に同じであれば、カスタム関数を避けることができます。それ以外の場合は、カスタム関数を使用したくない場合は、自分自身を繰り返してください。 –

0

=REGEXEXTRACT(JOIN("|",FILTER($A$1:$P$1, Regexmatch($A$1:$P$1,"ANIM|SENT TO EDIT|COMP"), NOT (ISBLANK(A2:P2)))),"([^|]+)$") 

regular expressionsを使用すると、テキストのような配列を処理する方法です。

関連する問題