GoogleシートでUNION SELECTを実行できますか?


10

同じフォームを使用して3回編集する、同じテーマの3人の異なる人からの返信を収集するフォームにリンクされたGoogleシートを持っています。これにより、3人がいる場所を示す3つの列を含むシートが作成されます。

これらの3つの列を取り、それらを互いに「下に」配置し、互いに隣接させないビュー/クエリを作成する必要があります。データベースでは、以下のクエリのようなものを実行しました。「シート」tblMainを呼び出し、関連する4つの列を記述しました(サブジェクトIDも必要です)。

tblMain:

ID        RALocation        RBLocation        RCLocation

クエリ:

Select ID, RALocation as Location, 'RA' as Role from tblMain
Union
Select ID, RBLocation as Location, 'RB' as Role from tblMain
Union
Select ID, RCLocation as Location, 'RC' as Role from tblMain

Googleスプレッドシートでこれを行う方法があるかどうか誰かが知っていますか?複数のシートを作成し、最後にそれらを組み合わせてもかまいませんが、これを行う方法には少し行き詰まっています。


行数は固定されていますか、それとも時間とともに変化しますか?
ルベン

回答:


3

空白のセルを保持するかどうかに応じて、2つのバージョンを提供します。基本的な考え方は同じです:

  1. テーブルに含まれていない文字(たとえば、を介してアクセスできるエキゾチックなUnicode文字CHAR)を選択します。
  2. JOIN3つの列それぞれのコマンドで使用します。
  3. 結果を連結し、間に文字を追加します。
  4. SPLIT 同じ文字で連結された文字列。
  5. TRANSPOSE 結果。

例えば:

=TRANSPOSE( SPLIT( JOIN(CHAR(57344),A1:A) &CHAR(57344)& JOIN(CHAR(57344),B1:B) &CHAR(57344)& JOIN(CHAR(57344),C1:C), CHAR(57344) ) )

/分割に参加するために、私は文字選んだところCHAR(57344)で、私的使用のために指定し、したがって、任意の有効な入力に存在してはなりません。

上記の式は、空白のエントリを削除し、これは何ですので、SPLITありません。これは、データに空白がない場合に便利です。データの最後の行がどこにあるかを追跡する手間を省きます。しかし、それ以外の場合は、空白を保持する必要があります。

空白を保持するために、スペースの代わりに別の私用のUnicodeを使用したことを除いて、Jacob Jan Tuinstraの回答に従います(たぶん、スペースのみを含むセルがあり、それらを保持したい場合があります)。これは、2つの余分な手順が含まれます。以前のように、すべてを接合した後、私が使用SUBSTITUTE交換するCHAR(57344)ことでCHAR(57344)&CHAR(57345)、その後、以前のように分割し、交換するCHAR(57345)空の文字列で。

=TRANSPOSE( ARRAYFORMULA(SUBSTITUTE( SPLIT( SUBSTITUTE(...joins... , CHAR(57344),CHAR(57344)&CHAR(57345)), CHAR(57344) ), CHAR(57345), "")))

完全な結果は次のようになります(データの最後の行の場所を指定したことに注意してください)。

=TRANSPOSE( ARRAYFORMULA(SUBSTITUTE( SPLIT( SUBSTITUTE(JOIN(CHAR(57344),A1:A9) &CHAR(57344)& JOIN(CHAR(57344),B1:B9) &CHAR(57344)& JOIN(CHAR(57344),C1:C9), CHAR(57344),CHAR(57344)&CHAR(57345)), CHAR(57344) ), CHAR(57345), "" )))

もう1つ注意点:Googleスプレッドシートの文字列の長さは50000文字を超えることはできません。データが大きすぎて文字列ベースのアプローチが機能しない場合は、スクリプトを使用します(このスクリプトを開始するのに適しています)。


それは御馳走であり、私は正しい結果を得るためにそれらを組み合わせることができます。私が今やろうとしているのは、それをNULL値を尊重して取得することだけです。FILTERは不要であることがわかりました。NULL値が見つかった場合、FILTERはそれらを削除します。NULLを尊重する方法を教えてください。
AnneB

1
実は、「その他の答え」は現時点では部分的な答えです。他の選択肢に加えて、関連する欠落している部分は、UNION-SELECTアプローチの代わりに埋め込み配列を使用する方法についてです。
ルベン

2
素晴らしい。パイロットが終了したときのスクリプトを確認する必要がありますが、今のところは十分です。ここの人々は本当に親切です、ありがとうございます!
AnneB


2

簡潔な答え

Googleスプレッドシートは非常に強力なツールで、UNION-SELECTと同様の結果を得るにはいくつかの選択肢があります。

代替案

組み込みアレイ

SPLIT-TRANSPOSE-JOIN-CHARを使用する別の方法は、埋め込み配列を使用することです。この方法の利点の1つは、文字列を作成または分解する必要がないため、文字数の制限が関係しないことです。

埋め込まれた配列

フィルタリング

UNION-SELECTの同様の動作を行うためにフィルタリングが必要な場合は、上記をFILTER()と組み合わせて使用​​できます。例

={Filter(A1:B2, B1:B2=2);Filter(D1:E2, E1:E2=6);Filter(G1:H2, H1:H2=12)}

QUERY()と組み合わせて使用​​することもできますが、その結果にはヘッダー行が含まれます。ヘッダーを削除する方法については、Googleスプレッドシートクエリの結果の行を削除するをご覧ください。

値の列を作成する方法

TRANSPOSE-SPLIT-REPTを使用して、値の列を作成します。

={Transpose(Split(REPT("RA,",6),","))}

また、QUERY()を使用して値の列を作成することもできますが、ヘッダー行を削除すると、式がより複雑になる可能性があります。文字列の長さの制限が問題を引き起こす場合にのみ使用してください。

組み込み配列とTRANSPOSE-SPLIT-REPTを使用したソリューション

範囲tblMainがA1:D7であり、A1:D1がテーブルヘッダーで、データがA2:D7であると仮定します。

={{"ID";A2:A7;A2:A7;A2:A7},
{"Location";B2:B7;C2:C7;D2:D7},{"Role";
Transpose(Split(REPT("RA,",6),","));
Transpose(Split(REPT("RB,",6),","));
Transpose(Split(REPT("RC,",6),","))}}

参考文献

Googleスプレッドシート配列の追加-StackOverflow


私からの回答をもっと読む必要があります;)これに関する公式のヘルプ記事はまだ見つかりませんでした。Googleプロダクトフォーラムやインターネットで、すでに紹介したリファレンスのようにスレッドがあることを知っています。
ルベン

ありがとうございます。現在、最後の解決策を検討しています。パイロットにとっては非常にうまくいくと思います!
AnneB、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.