Можно ли предварительно заполнить форму Google, используя данные из таблицы Google?
Я ищу способ "предварительно заполнить" форму Google конкретными данными из таблицы Google. Форма будет иметь одинаковые "стандартные" вопросы для всех, но данные в первых двух вопросах будут "предварительно заполнены" уникальными данными из существующей электронной таблицы Google. Данные будут уникальными в зависимости от их адреса электронной почты в существующей электронной таблице.
ПРИМЕР РАСПРЕДЕЛЕНИЯ ИСТОЧНИКА
Col 1 Col 2 Col 3
email name birthday
@mike Mike Jones May 9th 1975
@jim Jim Smith April 19th 1985
Пример формы первый
Вопрос 1 - заполнен данными (Майк Джонс) из электронной таблицы Google.
Вопрос 2 - заполнен данными (9 мая 1975 года) из таблицы Google.
Вопрос 3 - пустой (ожидание ответа пользователя)
Вопрос 4 - пусто (ожидается ответ пользователя)
Пример формы два
Вопрос 1 - заполнен данными (Джим Смит) из электронной таблицы Google.
Вопрос 2 - заполнен данными (19 апреля 1985 г.) из таблицы Google.
Вопрос 3 - пустой (ожидание ответа пользователя)
Вопрос 4 - пусто (ожидается ответ пользователя)
Кто-нибудь знает, можно ли это сделать? Если да, любая помощь или направление будут с благодарностью.
Заранее спасибо!
Тодд
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-адрес, адаптировав 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 форм понимает типы данных каждого элемента, мы можем избежать манипулирования строковым форматом дат и других типов, что несколько упрощает наш код.
(РЕДАКТИРОВАТЬ: есть более общая версия этого в Как предварительно заполнить флажки формы 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 новым методом для обработки преобразования.
При чтении дат из электронной таблицы вы получите объект 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]);
};