Можно ли предварительно заполнить форму 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]);
};
Другие вопросы по тегам