Можно ли "предварительно заполнить" форму 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 58

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]);
};