Перейти к основному содержимому

Ручной контроль правильности ответа на вопрос

· 3 мин. чтения

В SURVEYSTUDIO по умолчанию любой вопрос должен содержать ответ, иначе перейти к следующему вопросу не получится. Причём если вопрос табличный — требуется, чтобы ответ был в каждой видимой строке таблицы. Это удобно и позволяет разработчику не выполнять проверки вручную в каждом вопросе. Однако бывают случаи, когда стандартная валидация не подходит.

Длина текста

Допустим, у нас есть текстовый вопрос, и ответ должен быть не короче 3 символов. Для этого достаточно добавить скрипт после ответа:

if (Q.openValueTxt.length < 3) {
return error('Пожалуйста, дайте более развёрнутый ответ');
}

Проверка числа

Ещё пример. Есть табличный числовой вопрос, и нужно во всех строках требовать число от 1 до 100. Самый простой способ это сделать — добавить действие после ответа Сообщить об ошибке с необходимыми условием и текстом сообщения:

note

О синтаксисе выражений почитать можно здесь.

Ошибка будет выводиться, если в любой строке введено неверное число, без уточнения в какой. Если мы хотим выводить код строки с ошибкой, то действия нужно добавлять для каждой строки отдельно, но если строк много, то проще — скриптом после ответа.

  • Если Q(row = 1 and (valueNum < 1 or valueNum > 100)), то сообщить об ошибке "В строке 1 можно вводить только числа от 1 до 100"
  • Если Q(row = 2 and (valueNum < 1 or valueNum > 100)), то сообщить об ошибке "В строке 2 можно вводить только числа от 1 до 100"
  • Если Q(row = 3 and (valueNum < 1 or valueNum > 100)), то сообщить об ошибке "В строке 3 можно вводить только числа от 1 до 100"

И так далее.

Выделение строки с ошибкой

Вместо вывода кода строки, скриптом можно выделять текст строки с ошибкой для наглядности. Например, есть табличный вопрос с выбором ответа, и нужно разрешить выбирать ответ 7 только в строках с кодами 1, 3 и 9:

let rCodes = [1, 3, 9];
for (let row of Q.rows.getVisible()) {
row.text = row.plainText;

if (row.isChecked(7) && !rCodes.includes(row.code)) {
row.text = '<font color="red"><b>'+ row.text +'</b></font>';
return error('В этой строке нельзя выбирать ответ 7');
}
}

Не требовать ответ

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

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

for (let row of Q.rows.getVisible()) {
if (row.getCheckedCodes().length > 0) return ok;
}

return error('Пожалуйста, выберите хотя бы 1 ответ');
caution

Вопрос с отключённой проверкой ответа является для системы отвеченным, поэтому в скриптах свойство isAnswered для него всегда будет true.