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-空白(ユーザーの応答を待っています)
これを実行できるかどうかは誰にもわかりますか? 「はい」の場合、助けや指示は大歓迎です。
前もって感謝します!
トッド
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
この例では、質問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を各人にメールで送信できますが、既にいくつかの質問が入力されています。
ブルートフォースを使用してテンプレートを作成する代わりに、プログラムでテンプレートをつなぎ合わせることができます。これには、テンプレートを変更することを忘れずにコードを再利用できるという利点があります。
フォーム内の各質問はアイテムです。この例では、説明したとおり、フォームには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.
}
};
事前入力フォーム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]);
};