Как предварительно заполнить флажки формы Google?

Я просмотрел вопрос "Можно ли" предварительно заполнить "форму Google, используя данные из электронной таблицы Google?" и код, приведенный в ответе (спасибо Mogsdad), хорошо работает для вопросов текстового типа в форме Google. Мой вопрос: можно ли предварительно заполнить вопрос формы Google с флажком?

Например, если у меня есть электронная таблица с записью для «Имена», и одна из записей - «Фред, Барни», можно ли с помощью кодирования предварительно заполнить форму с флажками, отмеченными для «Фред» и « Барни "под флажком" Имена "введите вопрос формы Google?

Спасибо, Грейг


person Greig    schedule 15.10.2014    source источник


Ответы (4)


Базовый шаблон для каждого ответа можно повторить для большинства других типов. Например, это работает для множественного выбора:

            item = items[i].asMultipleChoiceItem();
            var respItem = item.createResponse(resp);

Однако установить флажок может быть сложно, так как он может содержать один элемент, несколько элементов и даже другие ответы. Когда ответ записывается в вашу электронную таблицу, он отображается в виде строки, разделенной запятыми; при получении в событии отправки формы (например, в триггерной функции) мы получаем массив (... где все ответы находятся в первом элементе массива в строке, разделенной запятыми). Метод createResponse() для checkboxItem ожидает массив допустимых вариантов ... так что мы можем предоставить это с помощью небольшой магии javascript:

            item = items[i].asCheckboxItem();
            // Response is a CSV string, need array
            var respArray = resp.split(/ *, */);
            var respItem = item.createResponse(respArray);

EDIT: у Google есть ошибка с CheckboxItems и MultipleChoiceItems при использовании с включенными опциями Other. Эти другие параметры разрешены, но неправильно отображаются в предварительно заполненном URL-адресе, и в результате они не отображаются в отображаемой форме. Просмотрите и отметьте проблему 4454 и пометьте ее. .

Вот обновленная версия функции из Можно ли« предварительно заполнить »форму Google, используя данные из электронной таблицы Google?, обновлено для обработки списков, множественного выбора и ответов с флажками. Эта версия является более общей, ее можно адаптировать к заголовкам в вашей электронной таблице. БОНУС: если вы добавите столбец с пометкой Prefilled URL, скрипт запишет туда свои сгенерированные URL.

скриншот

/**
 * Use Form API to generate pre-filled form URLs
 * 
 * https://stackoverflow.com/a/26395487/1677912
 */
function evenBetterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Form Responses 1");
  var data = ss.getDataRange().getValues();  // Data for pre-fill
  var headers = data[0];                     // Sheet headers == form titles (questions)

  var formUrl = ss.getFormUrl();             // Use form attached to sheet
  var form = FormApp.openByUrl(formUrl);
  var items = form.getItems();
  var urlCol = headers.indexOf("Prefilled URL");   // If there is a column labeled this way, we'll update it

  // Skip headers, then build URLs for each row in Sheet1.
  for (var row = 1; row < data.length; row++ ) {
    Logger.log("Generating pre-filled URL from spreadsheet for row="+row);
    // build a response from spreadsheet info.
    var response = form.createResponse();
    for (var i=0; i<items.length; i++) {
      var ques = items[i].getTitle();           // Get text of question for item
      var quesCol = headers.indexOf(ques);      // Get col index that contains this question
      var resp = ques ? data[row][quesCol] : "";
      var type = items[i].getType().toString();
      Logger.log("Question='"+ques+"', resp='"+resp+"' type:"+type);
      // Need to treat every type of answer as its specific type.
      switch (items[i].getType()) {
        case FormApp.ItemType.TEXT:
          var item = items[i].asTextItem();
          break;
        case FormApp.ItemType.PARAGRAPH_TEXT: 
          item = items[i].asParagraphTextItem();
          break;
        case FormApp.ItemType.LIST:
          item = items[i].asListItem();
          break;
        case FormApp.ItemType.MULTIPLE_CHOICE:
          item = items[i].asMultipleChoiceItem();
          break;
        case FormApp.ItemType.CHECKBOX:
          item = items[i].asCheckboxItem();
          // In a form submission event, resp is an array, containing CSV strings. Join into 1 string.
          // In spreadsheet, just CSV string. Convert to array of separate choices, ready for createResponse().
          if (typeof resp !== 'string')
            resp = resp.join(',');      // Convert array to CSV
          resp = resp.split(/ *, */);   // Convert CSV to array
          break;
        case FormApp.ItemType.DATE:
          item = items[i].asDateItem();
          resp = new Date( resp );
          resp.setDate(resp.getDate()+1);
          break;
        case FormApp.ItemType.DATETIME:
          item = items[i].asDateTimeItem();
          resp = new Date( resp );
          break;
        default:
          item = null;  // Not handling DURATION, GRID, IMAGE, PAGE_BREAK, SCALE, SECTION_HEADER, TIME
          break;
      }
      // Add this answer to our pre-filled URL
      if (item) {
      // Checking if there is any value
        if(resp[0].length != 0){
          var respItem = item.createResponse(resp);
          response.withItemResponse(respItem);
        }
      }
      // else if we have any other type of response, we'll skip it
      else Logger.log("Skipping i="+i+", question="+ques+" type:"+type);
    }
    // Generate the pre-filled URL for this row
    var editResponseUrl = response.toPrefilledUrl();
    // If there is a "Prefilled URL" column, update it
    if (urlCol >= 0) {
      var urlRange = sheet.getRange(row+1,urlCol+1).setValue(editResponseUrl);
    }
  }
};
person Mogsdad    schedule 16.10.2014
comment
Спасибо за ответ Могсдад. Я попробовал код, запустив его как скрипт в электронной таблице, и получил сообщение об ошибке: Недействительный ответ отправлен на элемент, относящийся к строке 64 (var respItem = item.createResponse (resp);), который находится на две строки ниже комментария // Добавить этот ответ на наш предварительно заполненный URL. Есть предположения? - person Greig; 16.10.2014
comment
Я пробовал это на небольшой таблице, похожей на пример, приведенный Могсдадом, и он работал нормально. Казалось бы, проблема в моей существующей форме и электронной таблице. У меня есть запись в ячейке csv, которая соответствует флажку, но нет соответствующего флажка, который можно было бы выбрать, когда он переходит в форму. - person Greig; 16.10.2014
comment
@Greig - документация для CheckboxItem.createResponse () объясняет это поведение; Выдает исключение, если какое-либо значение не соответствует допустимому выбору для этого элемента, если ваш вопрос не включает другие параметры. - person Mogsdad; 16.10.2014
comment
Добавлено примечание об ошибке Google с CheckboxItem и MultipleChoiceItem, связанной с Other. - person Mogsdad; 16.10.2014
comment
Есть ли способ пропустить пустые записи? - person Greig; 17.10.2014
comment
Можно ли сделать HTTP-вызов и получить значения оттуда вместо электронной таблицы и заполнить форму? - person Kartik Domadiya; 13.07.2015
comment
@Kartik - вы имеете в виду Предварительно заполните формы ответов? - person Greig; 16.10.2015
comment
@Mogsdad - у меня есть даты в моих предварительно заполненных данных, и при просмотре журналов переменная resp для даты отображается в формате Day MMM DD YYY HH: mm: ss Time Zone. Я прочитал в другом месте, что дата должна быть в формате ГГГГ-ММ-ДД. Когда я переключил "resp = new Date (resp);" журнал не изменился. Нужна ли корректировка формата даты в этом коде, или я просто запутался (как обычно)? Спасибо. - person Greig; 16.10.2015
comment
@Greig: Немного другая тема; этот другой вопрос - создание предварительно заполненного URL-адреса в виде строки, в то время как этот использует службу Forms для генерации того же самого из объектов JavaScript. Здесь нет необходимости форматировать дату, об этом позаботятся вы. - person Mogsdad; 16.10.2015
comment
@Mogsdad - Спасибо, Могсдад. Это действительно так. Независимо от того, как дата выглядела в журналах, она отлично работала, когда дело доходило до предварительного заполнения. (Я этого не видел, так как у меня была еще одна проблема с пустым ответом в поле флажка - что не имеет ничего общего с предоставленным кодом). - person Greig; 16.10.2015
comment
Могсдад: Я адаптирую evenBetterBuildUrls () и в процессе обнаружил некоторые изменения, которые могли бы улучшить его, облегчив внедрение новичками. I.E. Очень незначительное изменение: 'var data = ss.getDataRange (). GetValues ​​();' можно (нужно?) изменить на 'var data = sheet.getDataRange (). getValues ​​();' Я буду полужирным и отредактирую ваш код. Другие изменения, которые я делаю, - это добавление продолжительности, времени и сетки, добавление переключателя и нескольких строк кода, чтобы добавить возможность импорта ответов в форму. Также я перевожу комментарии на испанский. P.S. Очевидно, я дам вам правильную атрибуцию :) - person Rubén; 08.12.2015
comment
Упс, изменение слишком маленькое, и SO этого не допускает. - person Rubén; 08.12.2015

Когда вы редактируете форму, введите значения, которые вы хотите заполнить заранее.

Тогда получите pre-filled URL

введите описание изображения здесь

person Jack    schedule 16.10.2014

Это последний сценарий, который я разработал, он отлично работает для меня.

Обновление и предварительная ссылка для формы Google.

Этот скрипт не отключится, поскольку мы знаем, что время выполнения составляет 6 минут. Я заставил этот скрипт работать с триггером отправки формы Google и ручным триггером в функции для получения последней строки.

Заметка :

  1. вы должны изменить все номера на свою конкретную ячейку
  2. В частности, вы должны изменить запись формы в последней строке скрипта на свою собственную (обратите внимание на то, что входные данные рис. Имеют фиксированную уникальную запись)

person mbarki chadi    schedule 11.02.2015
comment
Не могли бы вы включить свой сценарий в свой ответ? Это сделало бы ваш ответ намного лучше. - person Lea Cohen; 11.02.2015

В сценарии, предоставленном в качестве ответа, есть небольшая проблема.

var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName("Form Responses 1");
var data = ss.getDataRange().getValues();  // Data for pre-fill

Переменные данные относятся к активному листу (ss), а не к листу «Form Responses 1» (лист). Это могло быть намеренно, но я подумал, что должен выделить это, если кто-то еще использует тот же лист для предварительного заполнения и ответов.

person Lisa Kriel    schedule 21.07.2017