GoogleフォームとGoogleスプレッドシートを使用して、Googleフォームデータを収集し、そのフォーム送信のデータを別のシートの複数のデータ行に自動的に分割するソリューションを開発しようとしています。
あるシートから別のシートにデータを照会する方法を学びました(多くの皆さんに感謝します)が、1行のデータを複数の行に自動的に分割する方法がわかりません。
問題の概要を説明するYouTubeビデオ を視覚的に示します(削除しません)。
基本的に、次の情報を収集するGoogleフォームが1つあります。
単一フォームの応答(1行)を、それぞれが同じ「ヘッダーデータ」を持つが一意の記録日を持つ複数の行(5行)に変換する自動化された方法が必要です。
例のフォームデータ
Header Data - Record Date (Student #1) - Record Date (Student #2) - Record Date (Student #3) - Record Date (Student #4) - Record Date (Student #5)
EXAMPLE必要な操作データ
Header Data - Record Date (Student #1)
Header Data - Record Date (Student #2)
Header Data - Record Date (Student #3)
Header Data - Record Date (Student #4)
Header Data - Record Date (Student #5)
セルA2->ヘッダー
=OFFSET('Form responses 1'!$A$2,ceiling((row()-1)/5,1)-1,0)
これは、ヘッダー列ごとに1回、数回繰り返すことができます。最後のパラメーターを適宜変更するだけです。
セルB2->データ
=OFFSET('Form responses 1'!$A$2,ceiling((row()-1)/5,1)-1,mod(row()-2,5)*2+1,1,2)
必要に応じて記入してください
OFFSET()
は、ソースデータから値を取得するために使用されます。'Form responses 1'!$A$2
は、列と行をカウントする開始点です。row()
は、行と列の反復子をインクリメントするために使用されます。ceiling((row()-1)/5,1)
は、ソースデータから行を設定するために使用されます。mod(row()-2,5)*2+1
、列反復子は、ソースデータから列を設定するために使用されます。複数の「ヘッダーデータ」列がある場合は、それぞれに1つずつ追加します。 I.E. 5つの「ヘッダーデータ」列と6つの「データ列」がある場合、列反復子は
mod(row()-2,5)*6+5
F2セルに追加される最終データ式は次のとおりです。
=OFFSET('Form responses 1'!$A$2,ceiling((row()-1)/5,1)-1,mod(row()-2,5)*6+5,1,6)
行と列の反復子では、「レコードデータ」に5つの列があるため、5が使用されます。
この回答は、以前の回答の式のリファクタリング版です
セルA2->ヘッダー
=OFFSET(responses!$A$2,ceiling((row()-row($A$1))/$M$1,1)-1,column()-column($A$1),1,COUNTA($A$1:$D$1))
セルE2->データ
=OFFSET(responses!$A$2,ceiling((row()-row($A$1))/$M$1,1)-1,mod(row()-(row($A$1)+1),$M$1)*COUNTA($E$1:$J$1)+COUNTA($A$1:$D$1),1,COUNTA($E$1:$J$1))
必要に応じて記入してください
OFFSET()
は、ソースデータから値を取得するために使用されます。'Form responses 1'!$A$2
は、列と行をカウントする開始点です。row()
は、行と列の反復子をインクリメントするために使用されます。ceiling((row()-row($A$1))/$M$1,1)
は、ソースデータから行を設定するために使用されます。mod(row()-(row($A$1)+1),$M$1)*COUNTA($E$1:$J$1)+COUNTA($A$1:$D$1)
、列反復子は、ソースデータから列を設定するために使用されます。COUNTA($E$1:$J$1)
では、データ列の数を示します。ヘッダーデータが存在する単一の単純なQUERY式を使用して、非常に「クリーンな方法」で(質問とビデオの両方での努力によって示されるように)目的を達成できます。列A-D
およびレコードデータは列E-AH
にセクション化されています。
=query({responses!A:J;responses!A:D,responses!K:P;responses!A:D,responses!Q:V;responses!A:D,responses!W:AB;responses!A:D,responses!AC:AH},"select * where Col7>1000 order by Col1")
動作する SAMPLE SPREADSHEET です。
PS:これは古い質問ですが、YouTubeのコメントで、まだ答えが見つからなかったと述べています。答えが機能する場合 受け入れる 他の人にも役立つように。 ( 投票する理由 )