web-dev-qa-db-ja.com

エラーを返すFILTERとの行ごとの比較

2つの別々のシートを行ごとに比較し、3番目のシートに等しくない行を表示しようとしています。例として、Sheet1の3行目と5行目はSheet2とは異なり、Sheet3にのみ表示したいと思います。

      SHEET1                    SHEET2
   A    B    C               A    B    C
1  INT  STR  BOOL         1  INT  STR  BOOL
2  1    A    TRUE         2  1    A    TRUE
3  2    B    FALSE        3  2    B    TRUE
4  3    C    TRUE         4  3    C    TRUE
5  4    D    FALSE        5  C    3    FALSE

だから私はSheet3を見てほしい:

      SHEET3
   A    B    C
1  INT  STR  BOOL
2  2    B    FALSE
3  4    D    TRUE

現在、私が使用している式は次のとおりです。

=ARRAYFORMULA(FILTER(IMPORTRANGE("URL1","A2:C5"), IMPORTRANGE("URL1","A2:C5")<>IMPORTRANGE("URL2","A2:C5")))

上記の式では、簡潔にするために「URL1」と「URL2」の代わりに適切なリンクが使用されています。この式は、説明とともに#VALUEエラーを与えています:

FILTERの範囲は、単一行または単一列でなければなりません。

誰もこれを修正する方法を知っていますか?

1
Jon

filterは一方向にのみソートされます。 2番目の引数はブール値の1次元の範囲でなければなりません。したがって、列を個別に比較する必要があります。これは、すべてのimportrangesですぐに見苦しくなります。

(IMPORTRANGE("URL1","A2:A5")<>IMPORTRANGE("URL2","A2:A5")) + (IMPORTRANGE("URL1","B2:B5")<>IMPORTRANGE("URL2","B2:B5")) + (IMPORTRANGE("URL1","C2:C5")<>IMPORTRANGE("URL2","C2:C5"))

したがって、代わりに query を使用することをお勧めします。これにより、より複雑なクエリが可能になります。 queryの最も重要な制限は、各列の内容が同じ型でなければならないことです(他の型はNULL値として扱われます)。 INT、STR、BOOLから、これが事実であるというデータを収集します。したがって、クエリは次のようになります。

=query({IMPORTRANGE("URL1","A2:C5"), IMPORTRANGE("URL2","A2:C5")}, "select Col1, Col2, Col3 where Col1 <> Col4 or Col2 <> Col5 or Col3 <> Col6")

ここでは、最初の引数は2つの配列の結合として取得されるため(同じ行数でなければなりません)、6つの列があります。 2番目の引数はクエリ文字列です。

2
user79865

簡潔な答え

 = ArrayFormula(
 {Headers; 
 FILTER(Sheet1、
 ISNUMBER(
 MATCH(
 Transpose(QUERY(Transpose( Data1), 1E + 100))、
 Transpose(QUERY(Transpose(Data2), 1E + 100))、
 0 
)
)
)
} 
)

説明

数式が機能しない場合は、エラーが発生している場所を見つけやすくするために、数式を単純化する必要があります。

OPによって公開されている場合、スプレッドシートの別の部分に移動するように、IMPORTRANGE部分を式から移動できます。

この回答では、次の名前を使用して式を読みやすくします。

  • ヘッダーは1 X 3の範囲です。
  • Data1は、IMPORTRANGE("URL1","A2:C5")によって返されるデータです。これには、3つの列と3つの行があります。
  • Data2は、IMPORTRANGE("URL2","A2:C5")によって返されるデータです。これには、3つの列と3つの行があります。

OPによって公開される式の簡略版は

=FILTER(SHEET1,SHEET1<>SHEET2)

OPによって報告されるエラーは、FILTERの2番目の引数が1列(n X 1、nは行数)の配列でなければならないために発生します。

この問題を解決する1つの方法は、列を連結することです。そのため、この回答では、次の構成を使用することを提案します。

 Transpose(QUERY(Transpose(Data1),,1E+100))

上記の構成は、ヘッダーとして宣言された行を連結するQUERYの機能を利用します。最初の内部Transposeは行を列にし、ヘッダーとして処理します。 2番目の引数は空で、3番目の引数は、すべての行(この場合はData1のすべての列)を包含するために十分な大きさです。外側のTransposeは、QUERYの結果が1列の配列になります。

配列式で<>のようなコンパレーターを使用すると、行ごとに比較されますが、SHEET1とSHEET2に異なる行数があると仮定すると、代わりにMATCHを使用する方が適切です。

ISNUMBERは、数学が見つかったときにTRUEを返し、それ以外の場合はFALSEを返します。配列を引数として使用すると、各セルに対して単一の結果が返されるため、この場合は3 X 1配列を返します。

短い回答のセクションで提案されている式は、任意の数の列と行のソース配列に簡単に適応できます。要件は、SHEET1とSHEET2の列数が同じであることです。

0
Rubén