web-dev-qa-db-ja.com

配列で範囲をフィルタリングする

UEFA EURO 2012のチームとそのスコアを含むGoogleスプレッドシートがあります。

_Team     Points  Goals scored
------   ------  ------------
Germany    6          3
Croatia    3          3
Ireland    0          1
...       ...        ...
_

次に、そのリストをフィルタリングして、結果に関係するチームのサブセットのみが含まれるようにします。具体的には、結果のリストにチーム、ドイツ、オランダ、ポルトガル、イタリア、イングランド、フランス、スペインおよびクロアチア

FILTER関数を使用してテーブルから単一の値を抽出できることはわかっています。したがって、おそらく=FILTER(A2:C; A2:A = 'Germany' OR A2:A = 'Netherlands' OR A2:A = 'Portugal' OR ...)のようなFILTER式を書くことができますが、チームのリストは動的なものなので、これを避けたいと思います。

だから問題は:単一の値だけでなく、値の範囲でテーブルをフィルタリングするにはどうすればよいですか?

18
Vidar S. Ramdal

私と同じようにこのスレッドに出くわした回答者は、こちら Googleプロダクトフォーラムページ を参照してください。ここでは、Yogiとahabの両方が、データの範囲をフィルタリングする方法の質問に対する解決策を提示しています。別の範囲のデータ。

A3:CにフィルタリングするUEFA EURO 2012データの範囲が含まれ、D3:Dにフィルタリングするチームのリストが含まれる場合、E3 ...

=FILTER(A3:C, MATCH(A3:A, D3:D,0))

または

=FILTER(A3:C, COUNTIF(D3:D, A3:A))

Positive filter results

逆に、D3:Dにリストされているチームではないでフィルタリングする場合は、E3...

=FILTER(A3:C, ISNA(MATCH(A3:A, D3:D,0)))

または

=FILTER(A3:C, NOT(COUNTIF(D3:D, A3:A)))

Negative filter results

これらは、これらの関数の有効性を示すために作成した スプレッドシートの例です

43
Greg

greg's 式を使用する必要があり、FILTERの範囲の不一致に苦労している人のために

=FILTER(A1:A, MATCH(A1:A, B1:B, 0))

=FILTER(A1:A, COUNTIF(B1:B, A1:A))

=FILTER(A1:A, ISNA(MATCH(A1:A, B1:B, 0)))

=FILTER(A1:A, NOT(COUNTIF(B1:B, A1:A)))

FILTER式を使用して2つの範囲間の評価を返す必要があり、これらの2つの範囲が異なるサイズ(クエリから返される場合など)であり、同じサイズに一致するように変更できず、FILTER has mismatched range sizes. Expected row count: etc.エラーが発生した場合、これは回避策です:

簡単にするために、フィルターの範囲がA1:A10およびB1:B8、配列括弧{}を使用して、範囲B1:B8に2つの仮想行を追加し、REPTを使用してサイズA1:A10を一致させることができます。

次に、このREPT式に、+ 1を修正/フェイルセーフとして追加する必要があります(2つの初期範囲の差が1の場合)。REPTは、最低2回の繰り返しで機能します。したがって、ある意味では、B1:B11の範囲を(B1:B8から)作成する必要があり、後で範囲から最後の行を切り捨てて、B1:B10に対してA1:A10になるようにします。 REPTに2つの一意の記号を使用します

次のステップは、REPTSPLITにラップし、2番目の一意の記号で除算することです。次に、(さらに必要に応じて)このSPLITTRANSPOSEにラップする必要があります(列のサイズを列のサイズに一致させるため)、最後のステップはQUERYにラップし、limitを次の簡単な計算で出力を再度出力しますCOUNTA(A1:A10)最後の担当者を削除します。まとめると、次のようになります。

=FILTER(A1:A10, NOT(COUNTIF(QUERY({B1:B8; 
 TRANSPOSE(SPLIT(REPT("♂♀", COUNTA(A1:A10)-COUNTA(B1:B8)+1), "♀"))}, 
 "limit "&COUNTA(A1:A10), 0), A1:A10)))

2
player0