web-dev-qa-db-ja.com

Googleスプレッドシートでのフォームデータ操作

GoogleフォームとGoogleスプレッドシートを使用して、Googleフォームデータを収集し、そのフォーム送信のデータを別のシートの複数のデータ行に自動的に分割するソリューションを開発しようとしています。

あるシートから別のシートにデータを照会する方法を学びました(多くの皆さんに感謝します)が、1行のデータを複数の行に自動的に分割する方法がわかりません。

問題の概要を説明するYouTubeビデオ を視覚的に示します(削除しません)。

基本的に、次の情報を収集するGoogleフォームが1つあります。

  1. 教師情報(ヘッダーデータ)
  2. レポート名(ヘッダーデータ)
  3. クラス情報(ヘッダーデータ)
  4. Student#1データ(レコードデータ:複数のフォームフィールド)
  5. Student#2データ(レコードデータ:複数のフォームフィールド)
  6. Student#3データ(レコードデータ:複数のフォームフィールド)
  7. Student#4データ(レコードデータ:複数のフォームフィールド)
  8. Student#5データ(レコードデータ:複数のフォームフィールド)

単一フォームの応答(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)
4
Mr. B

簡潔な答え

  1. 新しいシートを追加します。
  2. 次の数式を新しいシートに追加します

セル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が使用されます。

デモ

スプレッドシート

3
Rubén

この回答は、以前の回答の式のリファクタリング版です

簡潔な答え

  1. 新しいシートを追加します。
  2. 次の数式を新しいシートに追加します

セル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)は、ソースデータから行を設定するために使用されます。
  • 行および列の反復子では、$ M $ 1を使用して「レコードデータセット」の数を保持します。
  • COUNTA($ A $ 1:$ D $ 1)は、列ヘッダーの数をカウントします
  • mod(row()-(row($A$1)+1),$M$1)*COUNTA($E$1:$J$1)+COUNTA($A$1:$D$1)、列反復子は、ソースデータから列を設定するために使用されます。
  • データ式COUNTA($E$1:$J$1)では、データ列の数を示します。

デモ

スプレッドシート

1
Rubén

ヘッダーデータが存在する単一の単純な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のコメントで、まだ答えが見つからなかったと述べています。答えが機能する場合 受け入れる 他の人にも役立つように。 ( 投票する理由

0
marikamitsos