web-dev-qa-db-ja.com

Googleスプレッドシートのデータを使用してGoogleフォームに「事前入力」することは可能ですか?

GoogleフォームにGoogleスプレッドシートの特定のデータを「事前入力」する方法を探しています。フォームにはすべての人に対して同じ「標準」の質問がありますが、最初の2つの質問のデータには、既存のGoogleスプレッドシートの一意のデータが「事前入力」されます。データは、既存のスプレッドシートのメールアドレスに基づいて一意になります。

ソーススプレッドシートの例

Col 1       Col 2        Col 3 
email       name         birthday  
@mike       Mike Jones   May 9th 1975  
@jim        Jim Smith    April 19th 1985

フォーム例1

質問1-データが事前入力済み(Mike Jones) Googleスプレッドシートから。

質問2-データが事前入力済み(1975年5月9日) Googleスプレッドシートから。

質問3-空白(ユーザーの応答を待っています)

質問4-空白(ユーザーの応答を待っています)


フォーム例2

質問1-データが事前入力済み(Jim Smith) Googleスプレッドシートから。

質問2-データが事前入力済み(1985年4月19日) Googleスプレッドシートから。

質問3-空白(ユーザーの応答を待っています)

質問4-空白(ユーザーの応答を待っています)


これを実行できるかどうかは誰にもわかりますか? 「はい」の場合、助けや指示は大歓迎です。

前もって感謝します!
トッド

62
Mr. B

Drive Formsのドキュメント で説明されているように、フォームエディター内から事前に入力されたフォームURLを作成できます。たとえば、次のようなURLになります。

https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=Mike+Jones&entry.787184751=1975-05-09&entry.1381372492&entry.960923899

buildUrls()

この例では、質問1「名前」のIDは726721210であり、質問2「誕生日」は787184751です。質問3と4は空白です。

次のように、UIを介して提供されるURLをテンプレートに適合させることにより、事前に入力されたURLを生成できます。

function buildUrls() {
  var template = "https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=##Name##&entry.787184751=##Birthday##&entry.1381372492&entry.960923899";
  var ss = SpreadsheetApp.getActive().getSheetByName("Sheet1");  // Email, Name, Birthday
  var data = ss.getDataRange().getValues();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    var url = template.replace('##Name##',escape(data[i][1]))
                      .replace('##Birthday##',data[i][2].yyyymmdd());  // see yyyymmdd below
    Logger.log(url);  // You could do something more useful here.
  }
};

これは十分に効果的です-事前に入力されたURLを各人にメールで送信できますが、既にいくつかの質問が入力されています。

betterBuildUrls()

ブルートフォースを使用してテンプレートを作成する代わりに、プログラムでテンプレートをつなぎ合わせることができます。これには、テンプレートを変更することを忘れずにコードを再利用できるという利点があります。

フォーム内の各質問はアイテムです。この例では、説明したとおり、フォームには4つの質問しかないと仮定します。アイテム[0]は「名前」、[1]は「誕生日」などです。

送信しないフォームレスポンスを作成できます。代わりに、事前に入力されたフォームURLを取得するために、フォームを部分的に完成させます。 Forms APIは各アイテムのデータ型を理解するため、日付やその他の型の文字列形式を操作することを避けることができ、コードが多少簡略化されます。

EDIT:これには、より一般的なバージョンがあります Googleフォームのチェックボックスに事前入力するには?

/**
 * Use Form API to generate pre-filled form URLs
 */
function betterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Sheet1");
  var data = ss.getDataRange().getValues();  // Data for pre-fill

  var formUrl = ss.getFormUrl();             // Use form attached to sheet
  var form = FormApp.openByUrl(formUrl);
  var items = form.getItems();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    // Create a form response object, and prefill it
    var formResponse = form.createResponse();

    // Prefill Name
    var formItem = items[0].asTextItem();
    var response = formItem.createResponse(data[i][1]);
    formResponse.withItemResponse(response);

    // Prefill Birthday
    formItem = items[1].asDateItem();
    response = formItem.createResponse(data[i][2]);
    formResponse.withItemResponse(response);

    // Get prefilled form URL
    var url = formResponse.toPrefilledUrl();
    Logger.log(url);  // You could do something more useful here.
  }
};

yymmdd関数

事前入力フォームURLの日付アイテムは、yyyy-mm-ddという形式であることが期待されています。このヘルパー関数は、変換を処理する新しいメソッドでDateオブジェクトを拡張します。

スプレッドシートから日付を読み取ると、データの形式が日付として認識できる限り、javascript Dateオブジェクトになります。 (あなたの例は認識できないため、May 9th 1975の代わりに5/9/1975を使用できます。)

// From http://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/
Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear().toString();                                    
  var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
  var dd  = this.getDate().toString();             

  return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};
91
Mogsdad