Есть ли способ связать вопрос стиля «Выбрать из списка» в форме Google со списком данных (например, в электронной таблице)?

10

Есть ли способ связать вопрос стиля «Выбрать из списка» в форме со списком данных (например, в электронной таблице)?

Это будет означать, что по мере добавления новых опций в список в электронной таблице (или где бы то ни было возможно разместить список) они автоматически появятся в качестве опции для выбора в форме в будущем.

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

Я понятия не имею, возможно ли это, но я был бы очень признателен, если бы кто-нибудь мог предложить способ сделать это.

Энди
источник
К несчастью, вас нет рядом, чтобы увидеть все ответы ...
Джейкоб Ян Туинстра

Ответы:

3

Ответ Тома Хорвуда прекрасно работает, но только после исправления важной ошибки в его коде. Все ссылки на LIST_DATAэлементы должны быть сделаны с использованием индекса j(не i). У меня нет достаточной кармы, чтобы комментировать пост Тома, так что вот вам и монти:

Ниже приведен исправленный код. Я также изменил название LIST_DATAэлементов, чтобы они стали более наглядными. Это также показывает, как Том задумался (спасибо!) И предоставил возможность обновлять более одного элемента формы содержимым более одного списка электронных таблиц.

var FORMID = "PUT_YOUR_FORM_ID_HERE";
var LIST_DATA = [{formFieldTitle:"Job Number", worksheetName:"JobNumbers"},
             {formFieldTitle:"Task 1 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 2 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 3 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 4 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 5 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 6 Category", worksheetName:"TaskCategories"},
            ];

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
};

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j += 1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].formFieldTitle){
        updateListChoices(item.asListItem(), LIST_DATA[j].worksheetName);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

Подводя итог, как заставить это работать (для тех, кто, как и я, впервые использует Google Apps Script). В приведенном выше фрагменте кода я сослался на имена листов и имен полей форм, чтобы сделать его более понятным:

  1. В таблице, которая связана с вашей формой:

    • Создайте новый лист. Он будет содержать список элементов, которые вы хотите добавить в поле. Дайте листу подходящее имя (например, TaskCategories). Поместите свой список предметов в первый столбец этого листа. Удалите все лишние столбцы и строки на этом листе (это может или не может быть необходимо - не проверено)
    • В меню «Сервис» выберите «Редактор скриптов». Скопируйте приведенный выше фрагмент кода в редактор сценариев. Вам нужно будет изменить следующие части скрипта:
      • Значение переменной FORMIDнужно будет заменить на идентификатор вашей формы. Идентификатор - это длинный код (между косыми чертами) в строке URL-адреса в браузере для нужной формы.
      • LIST_DATAПеременной необходимо будет изменить в соответствии с вашими форму и ваши потребности. Вы заметите, что каждый элемент в LIST_DATAявляется кортежем formFieldTitleи worksheetName. Первым является имя поля формы (это должно быть поле типа «выбрать из списка») - в редакторе форм оно вызывается Question Title. Последний - это имя созданного ранее листа, содержащего список элементов, которыми вы хотите заполнить поле. Добавьте столько списков в список, сколько вам нужно.
      • Теперь сохраните скрипт (нажмите на иконку сохранения)
      • Протестируйте скрипт, выбрав «Run» в меню редактора скриптов и выбрав «updateLists». В первый раз, когда вы сделаете это, он попросит разрешения. Если сценарий выполнен успешно, вы можете заметить, что в вашей форме теперь заполнены указанные поля, в противном случае вы увидите сообщение об ошибке на экране.
  2. Если вы вернетесь к электронной таблице, вы должны увидеть новый пункт меню под названием List Updater. У него есть один элемент, Update Listsкоторый вам нужно запускать каждый раз, когда вы меняете любой лист (ы) своих списков - он обновит форму соответственно.

Также отмечу, что в интересах читателей, FormRanger не работает с новыми таблицами Google. Разработчики FormRanger говорят об этом на своем сайте. Возможно / надеюсь, что это изменится в будущем, но на момент публикации, вышеупомянутый код работает для меня, и я использую его в развернутой форме для клиента.

все естественно
источник
Я думаю, что это отличный ответ для включения пошаговых инструкций для тех, у кого нет опыта связывания сценария или чего-то еще. Кроме того, чтобы быть разборчивым при форматировании кода js, добавьте точку с запятой после инициализации массива LIST_DATA. Теперь, чтобы настроить его больше, например, если у вас есть столбец заголовка, используйте «for (var i = 1; i <data.length; i + = 1) {// Пропустить строку заголовка, начиная индекс с 1».
Гэри
Отредактировано, чтобы исправить пропущенную точку с запятой - спасибо @Gary за то, что обратили внимание :-)
allnatural
2

Вы можете сделать это с помощью обычной формы и скрипта, используя Form.getItems (), найти элемент в цикле, затем Item.asListItem (). SetChoices (...)

Вот пример кода, который я использовал в этом примере листа и формы

var FORMID = "YOUR FORM ID HERE";
var LIST_DATA = [{title:"Who's your tutor", sheet:"TutorName"}]

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j+=1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].title){
        updateListChoices(item.asListItem(), LIST_DATA[j].sheet);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  // If your sheets have headers, change i = 0 to i = 1
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}
Том Хорвуд
источник
Ссылка на форму теперь исправлена
Том Хорвуд
1

Существует дополнение Google Forms под названием « Значения форм», которое, по крайней мере, предлагает полуавтоматический способ: всякий раз, когда вы изменяете свои ответы в электронной таблице, вам нужно вручную повторно вводить варианты ответа, но по крайней мере это довольно просто сделать. ,

kynan
источник
0

Вы не можете сделать это с обычными формами Google.

Однако вы можете создать свой собственный графический интерфейс с помощью Google Apps Script и, в частности, UIService . Имейте в виду, однако, что вам придется заново создать весь графический интерфейс - вы не можете использовать части из вашей существующей формы.

Кроме того, вы можете использовать GUI Builder . Это WYSIWYG-редактор для графических интерфейсов Google Apps Script.

Что бы вы ни выбрали, вы должны быть готовы к программированию для достижения того, чего вы хотите.

Видар С. Рамдал
источник
1
GUI Builder устарел, так что я бы больше не использовал его.
Джейкоб Ян Туинстра
Служба UIS также устарела.
Рубен
0

Есть способ автоматизировать обновление списка, установив Триггер [ 1 ] [ 2 ] для Update Lists.

Путь - Редактор скриптов -> Ресурсы -> Триггеры текущего проекта

Тогда add a new trigger. Для приведенных примеров вы можете установить updatesListдля запуска from spreadsheetи On form submission. Таким образом, функция onOpenне понадобится.

Наюки Перейра Хара
источник
-1

Да, это можно сделать, потратив большую часть дня, чтобы найти ответ, а затем разработать его для моих целей, но это можно сделать.

Мне нужно было иметь добровольную регистрационную форму, чтобы люди могли отмечать несколько полей из списка областей, в которых они хотели бы участвовать. Поэтому один вопрос с несколькими полями, проблема в том, что в итоговой электронной таблице Google просто перечислены все проверенные в одной ячейке. Было 21 выбор добровольцев, так что, очевидно, не будет полезным форматом для этой информации. Я хотел сделать то, что, как я понял, вы хотите сказать, что вы хотите, я хотел, чтобы столбец содержал каждый из 21 параметра в отдельном столбце. Затем рядом с их меткой времени (сгенерированная форма), именем, адресом электронной почты и телефоном находятся 21 столбец с «да» или оставлено пустым. Заголовок столбца - это каждый параметр, который они могут выбрать. Кто-то может удивиться, почему бы не задать 21 вопрос с «да» или «нет».

Прежде всего обратите внимание, что когда кто-то заполняет форму Google, результирующая электронная таблица вставляет строку, а не добавляет данные в следующую пустую строку. Это означает, что любые формулы, которые были в строке, просто столкнулись, и новые данные из формулы не имеют следующих двух формул для работы с входными данными. Чтобы выйти за рамки этого, я добавил лист в электронную таблицу (рабочую книгу). Я использовал информацию от brettathds по адресу http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw. Поэтому я вставил следующую ячейку в ячейку A1 этого 2-го листа: = ARRAYFORMULA (Sheet1! A1: A). Я проделал подобное для каждого столбца через столбец E. В столбце E есть вопрос с 21 флажком.

Все еще на втором листе строка 1 столбца FY имела заголовки, идентичные тексту на каждой опции флажка из контрольного списка областей, которые они готовы добровольно предложить. Тогда столбец Z был следующим и последним вопросом в форме, это был короткий текстовый вопрос, который был просто озаглавлен «Дополнительные комментарии». Для этого столбца я использовал = ARRAYFORMULA (Sheet1! F1: F). Я сделал это как отдельный вопрос, вместо того, чтобы использовать опцию «other» в конце вопросов-флажков, так как, похоже, не было хорошего способа получить это. данные в электронную таблицу.

Теперь к части, которая отвечает, как вы получаете информацию из ячейки в столбце E (которая может содержать до 21 элемента в списке), чтобы разделить столбцы с «да» или просто пустым. Формула в F2 на втором листе имеет вид = iferror (if (search (F $ 1, $ E2)> 0, "Yes",)) Эта формула проверяет, найден ли точный текст в заголовке столбца (F1) в E2, если это так, он возвращает «Да», если нет, то оставляет его пустым.

Эта формула, на которую ссылаются в F2, написана (с использованием «$», через клавишу F4), так что F2 можно копировать / вставлять в каждую ячейку в строке 2 из GY (Google Spreadsheet не поддерживает копирование формул путем перетаскивания / копирования, как вы можете в Excel, но это можно сделать, выбрав F2, затем CTRL + C, затем выберите G2: Y2, затем CTRL + V). Затем я, используя ту же методологию, вставил копию F2: Y2 в F3: Y100.

Затем я спрятал столбец E на втором листе, чтобы полученная электронная таблица была более компактной (избегая всех переносов из длинных ответов).

Теперь я готов принять 99 добровольцев с помощью быстрой и простой формы, которую они заполняют. Использование параметров фильтра в верхней части столбцов также помогло увидеть, кто был доступен для каких областей.

Одно последнее разочарование, которое я так и не решил. Я заполнил несколько поддельных форм для проверки своих формул и дизайна, а затем удалил эти строки из связанной электронной таблицы. У меня также было несколько человек, которые заполнили дубликаты, я также удалил их строки. Примечательно, что на форумах по продуктам я не единственный, кто разочарован, узнав, что каким-то образом Google до сих пор хранит тестовые / поддельные / дублированные данные в «Сводке ответов» (находится на вкладке «Форма» электронной таблицы). Поэтому сводка ответов бесполезна для точности, если были удалены строки для удаления данных из тестовых / поддельных / дублирующих форм.

Но это сделано, и я сохраняю эти записи в следующий раз, когда мне понадобится подобное, я уверен, что в следующий раз это легко сделать менее чем за 30 минут.

Надеюсь, это поможет, дайте мне знать, если возникнут вопросы.

user37987
источник
2
Это много текста.
Джейкоб Ян Туинстра
Слава за усилия
Саарико