Ответ 1
Вы можете создать предварительно заполненный 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 "Имя" имеет идентификатор 726721210
, а вопрос 2 - "День рождения" - 787184751
. Вопросы 3 и 4 пусты.
Вы можете создать предварительно заполненный 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-адрес формы. Поскольку API-интерфейс Forms понимает типы данных каждого элемента, мы можем избежать манипулирования строковым форматом дат и других типов, что несколько упрощает наш код.
(РЕДАКТИРОВАТЬ: Есть ли более общая версия этого в флажках формы 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 с помощью нового метода обработки преобразования.
При чтении дат из электронной таблицы вы получите объект Date javascript, если формат данных распознается как дата. (Ваш пример не распознается, поэтому вместо 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]);
};