見出し画像

#75 複数のフォームからの回答を統合する

ある Facebook グループで見つけた以下のコメント。

最大の問題点は、フォームとスプシをそれぞれコピーをして使い回しするときに、連携させると細工をしたシートにデータが入らないことなのです(^^;)
 通常、上記のようにコピーで作ったフォームからコピーで作ったスプシに再連携をかけると、連携はされるのですが、新しく書き出しシートがつくられフォームの回答2となってしまいます。…そこを、もともとあったフォームの回答1にデータを書き出したい訳です。

いろんな背景で、複数のフォームを使用して回答を集めるものの、その回答が一つのシートに集まって欲しい、ということなのだと思います。

解決するためのプログラム

冒頭の問題点を解決する GAS のプログラムを作成してみました。
実際に作成したプログラムを埋め込んだ Google スプレッドシートは、以下の URL にアクセスすることで、自身の Google ドライブにコピーを作成できます。

https://docs.google.com/spreadsheets/d/1P5faqiT97ZsSgf5mzJ1luhoFGDoPAWDvo5DyGrDgqAU/copy

このスプレッドシートには、シート「統合した回答」とフォームからの回答を処理するための GAS のプログラムが保存されています。
以降で、使い方などについて説明します。

(1)使い方

フォームからの回答を GAS のプログラムで処理するために、トリガー関数を設定します。メニューから「拡張機能」→「Apps Script」と選択します。

「拡張機能」→「Apps Script」と選択

下図のように、15行の GAS のプログラムが保存されています。

スプレッドシートに保存されている GAS のプログラム
"use strict";                                       // 変数の宣言を強要する
const OUT_BOOK = '';                                // 統合先のシートがあるファイルの ID ※空欄なら、このファイル
const OUT_SHEET = '統合した回答';                     // 統合先のシートの名前

function onFormSubmit(e) {
  let ss;                                           // 処理対象のファイル
  if (OUT_BOOK == '') {
    ss = SpreadsheetApp.getActiveSpreadsheet();     // このファイル
  }
  else {
    ss = SpreadsheetApp.openById(OUT_BOOK);         // 指定された別のファイル
  }
  let sheet = ss.getSheetByName(OUT_SHEET);         // 出力先のシートを開く
  sheet.appendRow(e.values);                        // 回答の内容を、指定されたシートに追加する
}

画面左側の「トリガー」をクリックします。

画面左側の「トリガー」をクリック

更に、画面右下の「+ トリガーを追加」をクリックします。

画面右下の「+ トリガーを追加」をクリック

トリガー関数として、下図のように設定します。恐らく、デフォルト設定から変更しなければならないのは「イベントの種類を選択」の項目を「フォーム送信時」に変更するだけのはずです。

トリガー関数を設定

トリガー関数を設定しようとすると、実行するアカウントによる確認作業が必要になります。詳しくは以下の投稿をご覧ください。

トリガー関数を設定したら、スプレッドシートでの設定は完了です。

(2)実際の動作

動作確認のために、以下のような 2つのフォームを作成しました。違いが明確になるように、質問の数は同じですが、あえて内容を変えてあります。

動作確認のためのフォーム①
動作確認のためのフォーム②

それぞれのフォームの回答を、GAS のプログラムが埋め込まれたスプレッドシートに出力するように設定すると、下図のようにそれぞれのフォームの回答は別のシートに書き出されるようにシートが作成されます。 ※「フォームの回答 n」の n の部分は、設定をくり返すことで、数字が変わります。

それぞれ別のシートに回答が保存される

それぞれのフォームで、以下のように回答しました。

フォーム①の回答
フォーム②の回答

この結果、シート「統合した回答」には下図のように 2つのフォームの回答が統合して記録されます。

シート「統合した回答」

今回の動作確認では、質問の項目数は 1つに合わせてありますが、質問の内容が異なっています。そんな状況でも、シート「統合した回答」にはフォームへの回答が統合されます。
質問の項目数が違っていたとしても、下図のように統合されます。

項目数が違っても、そのまま統合される

(3)動作についての補足

  • 書き出し先となるシート「統合した回答」には、フォームからの回答がある度に、回答の中身だけが書き出されます。1行目の見出し行などは書き出されないので、手作業で追加・挿入してください。

  • 書き出し先となるシート「統合した回答」は、プログラムの 3行目で定義されている OUT_SHEET で指定しています。統合した回答を書き出すシートの名前を変更する場合には、この OUT_SHEET を変更してください。

  • 前項の OUT_SHEET で指定された、書き出し先となるシートが実際に存在しているかのチェックを行っていません。そのため、指定されたシート名のシートが存在していない場合にはエラーになります。

  • プログラムの 2行目で定義されている OUT_BOOK に別のスプレッドシートのファイル ID を指定しておくことで、GAS のプログラムが埋め込まれたスプレッドシート以外に回答を統合することができます。その場合、前項と同様に書き出し先となるシートが存在していること、当該ファイルへの書き込み権限を有していること、などを確認してください。 ※配布しているファイルの通り、OUT_BOOK が空(’’)となっていれば、同じファイル内のシートに統合します。

  • 上述の 15行の GAS のプログラムやトリガー関数の設定は、Google フォームの回答が書き出される Google スプレッドシートに設定されていなければなりません。 そのため、Google フォームが新規に作成した Google スプレッドシートでこの処理を行わせたい場合には、その Google スプレッドシートに GAS のプログラムを貼り付けて、トリガー関数を設定してください。 ※GAS のプログラムの書き出し先となるシートが別ファイルになる場合、別ファイルには GAS のプログラムやトリガー関数の設定は不要です。

最後に

最後に、お決まりのフレーズなどを書いておきます。

  • 一応の動作確認は行っているものの、不慮のトラブルによって損害等が生じても、責任はとれませんので予めご了承ください。

  • コメントを含めても 15行くらいのスクリプトであり、実行に際して目的外の場所への書き出しや収集などは行っていません。

  • 特別なエラー処理は行っていないので、意図しないケースでエラーが発生してしまうかもしれません。どうにもならない場合には、ご連絡ください。

わたし自身にしてみると、このような「スクリプトを作ること」が目的になっているような感じですが、このスクリプトが何かの役に立てば幸いです。

この記事が気に入ったらサポートをしてみませんか?