Можно ли "предварительно заполнить" форму 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-предварительно заполнены данными (Джим Смит) от a таблицы 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, адаптировав тот, который предоставляется через пользовательский интерфейс, чтобы быть шаблон, как это:
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 понимает типы данных каждого элемента, мы можем избежать манипулирования строковым форматом дат и другими типами, что упрощает наш код отчасти.
(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 объект, если формат данных распознается как дата. (Ваш пример не распознается, поэтому вместо
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]); };