Чи є спосіб зв’язати питання у стилі "Вибрати зі списку" у формі Google до списку даних (наприклад, у електронній таблиці)?


10

Чи є спосіб зв’язати питання стилю "Вибрати зі списку" у формі до списку даних (наприклад, у таблиці)?

Це означає, що як нові параметри будуть додані до списку в електронній таблиці (або де б це не було можливо розмістити список), вони автоматично з’являться як вибір у майбутньому у формі.

У моєму випадку це означало б, що респонденти, які заповнюють форму, зможуть вибирати, які волонтери були присутніми на цьому конкретному волонтерському сеансі із вичерпного списку добровольців (а не вводити кожне ім’я окремо), але оскільки волонтери приєднуються епізодично, це було б дуже корисно, якби можна було автоматично додавати їх до параметрів у списку, а не додавати нову опцію кожен раз вручну.

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


На жаль, вам не доводиться бачити всі відповіді…
Jacob Jan Tuinstra

Відповіді:


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. Останнє - це назва створеного раніше робочого аркуша, який містить список елементів, з якими потрібно заповнити поле. Додайте до списку стільки цих кортежів, скільки вам потрібно.
      • Тепер збережіть сценарій (Клацніть на іконку збереження)
      • Перевірте сценарій, вибравши «Запустити» у меню редактора сценаріїв та вибравши «Оновити списки». Перший раз, коли ви це зробите, він запитає дозволу. Якщо сценарій успішний, то ви можете помітити, що у вашій формі тепер вказані поля заповнені, інакше ви помітите повідомлення про помилку на екрані.
  2. Якщо ви повернетесь до електронної таблиці, ви побачите новий пункт меню під назвою List Updater. У нього є один елемент, Update Listsякий потрібно запускати щоразу, коли ви змінюєте будь-який список своїх списків (ів) - він відповідно оновить форму.

Я також зауважу, на користь читачів, що FormRanger не працює з новими електронними таблицями Google. Розробники FormRanger розповідають стільки ж на своєму веб-сайті. Можливо / сподіваюся, це зміниться в майбутньому, але оскільки на момент публікації цього повідомлення вищезгаданий код працює для мене, і я використовую його у розгорнутій формі для клієнта.


Я вважаю, що це чудова відповідь для включення поетапних для тих, хто не має досвіду асоціювання сценарію чи чогось іншого. Крім того, щоб бути вибагливим до форматування коду js, додайте крапку з комою після ініціалізації масиву LIST_DATA. Тепер, щоб налаштувати його більше, наприклад, якщо у вас є колонка заголовка, використовуйте "для (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 під назвою Form Values, яке принаймні пропонує напівавтоматичний спосіб: кожного разу, коли ви змінюєте свої відповіді в електронній таблиці, вам потрібно вручну повторно заповнити вибір у своїй відповіді, але принаймні це досить просто. .


0

Ви не можете цього зробити за допомогою звичайних форм Google.

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

Крім того, ви можете використовувати GUI Builder . Це редактор WYSIWYG для графічних інтерфейсів Google Apps.

Що б ви не вибрали, ви повинні бути готові виконати деяке програмування, щоб досягти того, що хочете.


1
GUI Builder застарілий, тому я його більше не використовую.
Яків Ян Туінстра

Служба UIService також застаріла.
Рубен


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, тому я вставив таку формулу у комірку А1 цього другого аркуша: = ARRAYFORMULA (Sheet1! A1: A). Я робив подібне для кожного стовпця через стовпець E. У колонці E є питання з 21 прапорцями.

Ще на другому аркуші рядок 1 стовпців FY мав заголовки, ідентичні тексту у кожному варіанті прапорця з контрольного списку областей, які вони готові надіслати на волонтерство. Тоді стовпець Z був наступним і останнім запитанням форми, це було коротке текстове запитання, яке саме було назване "Додаткові коментарі". Для цього стовпчика я використав = ARRAYFORMULA (Sheet1! F1: F), я зробив це як окреме запитання, а не використовуючи параметр "інше" в кінці питань, щоб не було гарного способу зробити це дані в електронну таблицю.

Тепер до частини, яка відповідає на те, як отримати інформацію з комірки у стовпці Е (яка може містити до 21 перерахованого елемента), розділити стовпці "так" або просто порожнім. Формула у F2 на другому аркуші = = iferror (якщо (пошук (F $ 1, $ E2)> 0, "Так",)) Ця формула шукає, щоб знайти точний текст у заголовку стовпця (F1) у E2, якщо він є, то він повертає "Так", якщо не, він залишає порожнім.

Ця формула, на яку посилається F2, написана (використовуючи "$" за допомогою клавіші F4), щоб F2 можна було скопіювати / вставити до кожної комірки в другому рядку з GY (електронна таблиця Google не підтримує копіювання формул шляхом перетягування / копіювання, як можна в Excel, але це можна зробити, вибравши F2, потім CTRL + C, потім виберіть G2: Y2, потім CTRL + V). Потім я використовую ту саму методологічну копію, що вставляла F2: Y2 в F3: Y100.

Потім я сховав стовпець Е на другому аркуші, щоб отримана електронна таблиця була більш компактною (уникаючи всього обгортання з довгих відповідей).

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

Одне остаточне розчарування, яке я не вирішив. Я заповнив кілька фіктивних форм, щоб перевірити свої формули та дизайн, потім видалив ці рядки із пов’язаної таблиці. У мене також було кілька людей, які заповнювали дублікати форм, я також видаляв їхні рядки. Зауваживши, що на форумах продуктів я не єдиний, хто засмучений, коли дізнається, що Google як і раніше має тестові / фальшиві / дублікати даних, підключені до "Підсумків відповідей" (знайдених у вкладці електронної таблиці "Форма"). Тому підсумок відповідей марний для точності, якщо для видалення даних із тестових / фіктивних / дублікатних форм були видалені рядки.

Але це зроблено, і я зберігаю ці записки наступного разу, коли мені потрібно подібне, я впевнений, що це можна було б легко зробити менше ніж за 30 хвилин наступного разу.

Сподіваюся, це допоможе, дайте мені знати, якщо є якісь питання.


2
Це багато тексту.
Яків Ян Туінстра

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.