Вопрос или проблема
Я использую App Script для создания Google формы на основе данных из таблицы. На данный момент всё работает отлично!
У меня есть один вопрос, который представляет собой сетку. Я хочу, чтобы вопрос был обязательным (или чтобы он требовал один ответ для каждого столбца), но я не хочу, чтобы требовался ответ для каждой строки. У меня больше строк, чем столбцов, и было бы плохо для пользовательского опыта менять местами строки и столбцы.
Давайте рассмотрим пример из документации:
// Добавить элемент сетки флажков в форму и требовать один ответ на каждый столбец.
var checkboxGridItem = form.addCheckboxGridItem();
checkboxGridItem.setTitle('Где вы встречали Новый год?')
.setRows(['Нью-Йорк', 'Сан-Франциско', 'Лондон'])
.setColumns(['2014', '2015', '2016', '2017']);
var checkboxGridValidation = FormApp.createCheckboxGridValidation()
.setHelpText("Выберите один элемент в каждом столбце.")
.requireLimitOneResponsePerColumn()
.build();
checkboxGridItem.setValidation(checkboxGridValidation);
Я использовал валидацию данных “.requireLimitOneResponsePerColumn()”. Что это делает, так это не позволяет пользователю отметить более одного элемента в каждом столбце (хорошо). Но сам вопрос не является обязательным, поэтому некоторые из моих пользователей пропустили его.
Недавно я попробовал метод “setRequired()”. Код будет выглядеть так:
// Добавить элемент сетки флажков в форму и требовать один ответ на каждый столбец.
var checkboxGridItem = form.addCheckboxGridItem();
checkboxGridItem.setTitle('Где вы встречали Новый год?')
.setRows(['Нью-Йорк', 'Сан-Франциско', 'Лондон'])
.setColumns(['2014', '2015', '2016', '2017'])
.setRequired(true); //<<< вот часть, которую я добавил
var checkboxGridValidation = FormApp.createCheckboxGridValidation()
.setHelpText("Выберите один элемент в каждом столбце.")
.requireLimitOneResponsePerColumn()
.build();
checkboxGridItem.setValidation(checkboxGridValidation);
Что это делает, так это заставляет вопрос требовать один ответ для каждой строки! Это делает невозможным для пользователя ответить на этот вопрос, так как у нас есть ограничение на один ответ на столбец, а строк больше, чем столбцов. Google форма постоянно выдает сообщения об ошибках, таких как:
“Não selecione mais de uma resposta por coluna” = “Не выбирайте более одного ответа в столбце”
“Esta pergunta exige pelo menos uma resposta por linha” = “Этот вопрос требует как минимум одного ответа в строке”
Как мне создать вопрос в формате сетки, который является обязательным (сам вопрос является обязательным, а не требование одного ответа для каждой строки), и одновременно допускает только один ответ на столбец?
Ответ или решение
Чтобы установить элемент CheckboxGridItem в Google Forms так, чтобы была обязательной одна запись в каждом столбце, при этом не требуя обязательных ответов на строки, следует воспользоваться комбинацией методов для текстового вопроса и валидации. Ниже приведен поэтапный подход для достижения этой цели с использованием Google Apps Script.
Шаг 1: Создание элемента CheckboxGridItem
Первым делом создадим элемент CheckboxGridItem в форме Google, определив строки и столбцы для опроса. Это будет элемент, на который пользователи будут отвечать.
// Создаем элемент чекбокса сетки
var checkboxGridItem = form.addCheckboxGridItem();
checkboxGridItem.setTitle('Где вы праздновали Новый год?')
.setRows(['Нью-Йорк', 'Сан-Франциско', 'Лондон'])
.setColumns(['2014', '2015', '2016', '2017']);
Шаг 2: Установка валидации ответов
Для обеспечения того, чтобы пользователи могли выбирать лишь один вариант ответа в каждом столбце, необходимо создать объект валидации и установить его для нашего элемента CheckboxGridItem. В этом же шаге мы также сделаем сам вопрос обязательным.
// Создаем валидацию для чекбокса сетки
var checkboxGridValidation = FormApp.createCheckboxGridValidation()
.setHelpText("Выберите один вариант на столбец.") // Текст подсказки
.requireLimitOneResponsePerColumn() // Ограничение на один ответ в столбце
.build();
checkboxGridItem.setValidation(checkboxGridValidation);
Шаг 3: Обеспечение обязательности вопроса
Теперь, чтобы сделать сам вопрос обязательным, но без необходимости отвечать на каждую строку, мы создаем дополнительный вопрос, который будет выступать в качестве проверки. Это может быть отдельный вопрос, гарантируя, что пользователь не может пропустить ответ на сам вопрос. Например, предоставляя пользователю возможность выбрать вариант перенаправления на опрос или написать об этом в комментарии.
// Добавляем вспомогательный вопрос для проверки
var followUpQuestion = form.addMultipleChoiceItem();
followUpQuestion.setTitle('Пожалуйста, подтвердите, что вы ответили на предыдущий вопрос.')
.setChoices([
followUpQuestion.createChoice('Да', true),
followUpQuestion.createChoice('Нет', false)
])
.setRequired(true);
// Привязываем логику к валидации (заявленное условие)
Заключение
Таким образом, данное решение позволяет сделать элемент CheckboxGridItem «обязательным» в контексте того, что требуется один ответ за столбец, без необходимости отвечать на каждую строку. Это решение оптимально сочетает в себе требования пользователя и функциональность Google Forms.
При реализации данного кода в вашем проекте следует учитывать, что Google Forms API имеет свои нюансы, и описанное решение может потребовать дополнительной настройки в зависимости от контекста. В результате пользователи смогут удобно и эффективно заполнять форму без чрезмерной нагрузки и обязательных ответов на каждую строку.