web-dev-qa-db-ja.com

Googleスプレッドシートで、正規表現によって変更された一意のアイテムを一覧表示するにはどうすればよいですか?

アイテムと価格が記載されたGoogleスプレッドシートがあります。列Dには価格があり、列Cにはアイテム名があり、その一部には複数の単語が含まれています。アイテムに複数の単語がある場合、最初の単語のみが本当に重要です。

私が達成したいのはこれです:

  1. アイテムリストを処理して、非アルファ文字の後にあるものを取り除きます。
  2. SORT(UNIQUE())結果、
  3. SUM()この新しいリストを作成するために一致したすべてのアイテム。

次に、結果を含む円グラフ(これは結局のところ食べ物です)を生成します。だから、例えば、私は持っているかもしれません:

  1    C             | D
  -------------------+------------
  2    Cheese        | $9.08
  3    Milk, 2L      | $3.89
  4    Avocado       | $0.99
  5    Avocado 3/$5  | $5.00
  6    Apples Fuji   | $2.75
  7    Avocado       | $1.49
  8    Milk 4L       | $4.75
  9    Apples        | $2.25

最終結果は次のようになります。

  Cheese   | $9.08
  Milk     | $8.64
  Avocado  | $7.48
  Apples   | $5.00

REGEXEXTRACT()を使用して個々のフィールドを解析できることを知っています。

=REGEXEXTRACT(C3; "^([A-Za-z]+)")

予想どおり、Milkを返します。同様に、FILTER()を使用して列の合計を加算できることを知っています。

  L                   | M
  --------------------+----------
  =UNIQUE( C2:C )     | =SUM( FILTER( D$2:D; L2=C$2:C ) )
  =CONTINUE(C2, 2, 1) | =SUM( FILTER( D$2:D; L3=C$2:C ) )
  ...

しかし、これらを組み合わせて、REGEXEXTRACT()によって変更されたアイテムの合計を加算します。私は次のようなことができることを望んでいました:

=UNIQUE( REGEXEXTRACT( C2:C; "^([A-Za-z]+)" ) )

そして

=SUM( FILTER( D$2:D; L2=REGEXEXTRACT(C$2:C, "^([A-Za-z]+)") ) )

ただし、範囲を指定すると、REGEXEXTRACT()関数は配列ではなく文字列のみを提供します。私は式を試してみると:

=REGEXEXTRACT(UNIQUE(C2:C); "^([A-Za-z]+)")

私が得るエラーは「文字列ではない:Cheese」です。

だから私の質問は...この作品をどうやって作るのですか?

橋として「スクラッチ」ワークシートを作成する必要がありますか?数式内でREGEXEXTRACT()結果セットの各要素をUNIQUE()することは可能ですか?

5
ghoti

私のアプローチは、最初にデータを「正規化」することです。

=ArrayFormula(IF({1,0};IFERROR(REGEXEXTRACT(A2:A;"^([a-zA-Z]+)"));B2:B))

そして、実際にこれを QUERY 関数で直接ラップして、目的の出力を生成できます。

=ArrayFormula(QUERY(IF({1,0};IFERROR(REGEXEXTRACT(A2:A;"^([a-zA-Z]+)"));B2:B);"select Col1, sum(Col2) where Col1 != '' group by Col1 label sum(Col2) ''";0))

ヘッダー行も出力できます:

=ArrayFormula(QUERY(IF({1,0};IFERROR(REGEXEXTRACT(A2:A;"^([a-zA-Z]+)"));B2:B);"select Col1, sum(Col2) where Col1 != '' group by Col1 label Col1 'Food Item', sum(Col2) 'Total'";0))

1
AdamL