Скриптование вопросов
ВНИМАНИЕ! Использование скриптов может привести к “непроходимой анкете“. Тщательно тестируйте шаблоны перед отправкой в работу.
Общая информация
К каждому вопросу можно указать JS-скрипты:
До показа: перед отображением вопроса пользователю (команды:
answer
,skip
)После ответа: анализ ответа и управление логикой (команды:
flc
,finish
)
Скрипт влияет только на вопрос, к которому привязан. Рекомендуется минимизировать количество скриптов в цепочке вопросов для снижения нагрузки.
Доступные объекты
history // массив кодов показанных вопросов ["Q1", "Q2", ...]
question // объект текущего вопроса
answer // объект ответа (если есть)
media // массив медиа [{'name': 'имя файла', 'type': 'Image|Video|Audio'}, ...]
cycle // информация о цикле {'index': 1, 'length': 5, 'option': 'label', 'native': 4} или null
memory // объект для передачи данных между скриптами
version // версия движка (с 2.5.3)
Для отладки и сообщениях об ошибках используются функции console.log, console.warn, console.error.
Сообщения типа log и warn показывается только при тестировании шаблона, error - при любом заполнении.
Объект question
Общие свойства
Свойство | Описание |
---|---|
| Код вопроса ("Q1") |
| Текст вопроса |
| Текст с HTML ( |
| Комментарий для респондента |
| Комментарий с HTML ( |
Специфичные свойства в зависимости от типа вопроса
Текстовый вопрос
Min
(integer)
— минимальная длина ответаMax
(integer)
— максимальная длина ответаRegexpEnabled (boolean)
— включена ли проверка регулярным выражениемRegexp (string)
— регулярное выражениеRegexpMessage (string)
— сообщение об ошибке
Выбор вариантов, Уточняющий
Min
(integer
) — минимальное количество вариантовMax
(integer
) — максимальное количество вариантовOptions (object)
— словарь вариантов, ключ - строка с числом кода ответа, значение - объект с описанием варианта:Label
(string
)— название вариантаPreChecked (boolean)
— выбран по умолчаниюOther (boolean)
— поле «Другое»OtherNumber (boolean)
— тип поля «Другое» (текст/число)OtherNotEmpty (boolean)
— требуется ввод текстаOtherMin
(integer
) — минимальная длина текстаOtherMax
(integer
) — максимальная длина текстаShowRespondent (boolean)
— видимость для респондентаExcluder (boolean)
— исключающий вариантFinisher (boolean)
— завершает опрос
Сетка
Rows
— массив строк:Native
(string
)— ID строкиLabel
(string
)— название строкиMin
(integer
) — минимальное количество колонокMax
(integer
) — максимальное количество колонокOther (boolean)
— поле «Другое»OtherNumber (boolean)
— тип поля «Другое»OtherMin (integer)
— минимальная длина текстаOtherMax
(integer
) — максимальная длина текстаValues (array)
— массив значенийMedia (array)
— медиа-файлы
Columns
— массив столбцов:Label
(string
)— название столбцаOther (boolean)
— поле «Другое»OtherNumber (boolean)
— тип поля «Другое»OtherMin
(integer
) — минимальная длина текстаOtherMax
(integer
) — максимальная длина текстаMedia (array)
— медиа-файлы
Диапазон
Options (object)
— словарь ответов, ключ - строка с числом кода ответа, значение - объект с описанием варианта:Label
(string
)— название вариантаFrom (integer)
— нижняя граница допустимого значенияTo (integer)
— верхняя граница допустимого значенияExact(boolean)
— вариант ответа для ввода точного значенияDecline(boolean)
— вариант ответа для отказаShowRespondent (boolean)
— видимость для респондентаFinisher (boolean)
— завершает опрос
Ранг
Percent (boolean)
— используется ли распределение по процентамOptions (object)
— словарь ответов, ключ - строка с числом кода ответа, значение - объект с описанием варианта:Label
(string
)— название вариантаShowRespondent (boolean)
— видимость для респондента
Шкала
ScaleType
(string
) — тип шкалы (normal/extended)Min (integer)
— нижняя граница шкалыMax (integer)
— верхняя граница шкалыLabelMin (string)
— подписи к ключевым точкам шкалыLabelMax (string)
— подписи к ключевым точкам шкалыLabelM1 (string)
— подписи к ключевым точкам шкалыLabelM2 (string)
— подписи к ключевым точкам шкалыLabelM3 (string)
— подписи к ключевым точкам шкалы
Число
AllowNegative
(boolean
) — разрешены ли отрицательные числаDecimalPlaces (integer)
— количество знаков после запятойMin (decimal)
— нижняя граница диапазонаMax (decimal)
— верхняя граница диапазонаUnits (string)
— единицы измерения
Раздел
Order (array)
— массив кодов вопросов в порядке их отображения в разделаShow (boolean)
— определяет, отображается ли заголовок раздела в интервьюRotations (array)
— массив настройки ротацийRandom (boolean)
— если true, порядок вопросов определяется случайным образомOrder (array)
— фиксированный порядок вопросов внутри данной ротации
Цикл
Order (array)
— массив кодов вопросов в порядке их отображения в циклеShow (boolean)
— определяет, отображается ли заголовок цикла в интервьюRotations (array)
— массив настройки ротацийRandom (boolean)
— если true, порядок вопросов определяется случайным образомOrder (array)
— фиксированный порядок вопросов внутри данной ротации
Объект answer
Общие свойства
Свойство | Описание |
---|---|
|
|
Специфичные свойства в зависимости от типа вопроса
Текстовый вопрос
Value (string)
— текст ответа
Выбор вариантов, Уточняющий
Order
(array
) — порядок выбора вариантовOptions (object)
— словарь вариантов, ключ - строка с числом кода ответа, значение - объект с описанием варианта:Name
(string
)— название вариантаValue (string)
— значение поля другое
Сетка
Cells
— массив объектов, содержащих информацию о строке, столбце и значенииRowName
(string
)— текстовое название строкиColumnName
(string
)— текстовое название столбцаRowNativeName
(string
) — код строкиCell
(integer
) — значение выбранной ячейкиOther (string)
— дополнительное значение (если ячейка предполагает ввод "другое")
Дата
Value (string)
— ответ в формате ДД.ММ.ГГГГ
Диапазон
Native
(string
)— код выбранного диапазонаRangeNative (string)
— код выбранного диапазонаExact(boolean)
— задано ли точное значениеValue (integer)
— числовой ответ
Ранг
Options (object)
— словарь ответов, ключ - строка с числом кода ответа, значение - объект с описанием варианта:Name
(string
) — текст варианта ответаValue (integer)
— порядковый номер или количество процентов
Шкала
Value (integer)
— выбранное значение шкалы
Число
Value
(decimal
) — введенное числоUnits (string)
— единицы измерения
Доступные функции:
makeSubstitution(message)
- вычислить подстановку
getAnswer(questionCode)
- получить ответ по коду вопроса
getQuotas(questionCode) -
получить массив квот (работает только в SF 2.0)
getAppliedQuotas()
-
получить применяемые квоты (работает только в SF 2.0)
Команды
задаются в формате:
commands.question.push({...}) — управление текущим вопросом.
commands.interview.push({...}) — управление анкетой в целом.
Управление анкетой
{'command': 'answer', 'forceValidation': 'false'} // ответить и перейти {'command': 'skip'} // пропустить вопрос {'command': 'flc'} // после ответа {'command': 'flc', 'message': 'текст ошибки'} {'command': 'finish', 'type': 'Section'} // доступен только в секции after: type = 'Section' - перейти к концу раздела type = 'Interview' - закончить интервью type = 'Cycle' - выйти из цикла
Управление вопросом
Все типы вопросов:
{'command':'setLabel', 'value':'text', 'plainValue':'text', 'html': false} - установка текста вопроса value - может включать html разметку plainValue - не обязательное поле, обычный текст html - не обязательное поле, если false значит html теги не используются {'command':'setComment', 'value':'text', 'plainValue':'text', 'html': false} - установка комментария {'command':'clearAnswer'} - очистить текущий ответ {'command':'hideMedia', 'name':'file.name'} - скрыть медиа-файл приложенный к вопросу
Текст:
{'command':'setAnswer', 'value':'text'} - установить ответ
Выбор вариантов, уточняющий:
в качестве value используется код ответа
{'command':'checkOption', 'value':'5', 'other': 'Some text', 'required':true} - выбрать ответ. Other - значение поля "Другое". Required - после выбора, блокируется возможность снятия ответа интервьюером. Other, required - не обязательное поле {'command':'uncheckOption', 'value':'11'} - снять выбор с варианта {'command':'hideOptions', 'value':['3','4','5']} - скрыть варианты ответов {'command':'orderOptions', 'value':['3','4','5']} - изменить порядок следования вариантов ответа. Указанные будут первыми в этом порядке, остальные “съедут” не изменив порядок {'command':'updateOption', 'nativeName':'3', 'label':'New name','finisher':false,'excluder':false,'showRespondent':true} - редактировать вариант ответа. Все параметры не обязательны
Сетка:
{'command':'check', 'row':'R3', 'value': 3, 'other': 'text'} - выбрать ячейку {'command':'uncheck', 'row':'R3', 'value': 3} - снять выбор с ячейки {'command':'hide', 'rows':['R3', 'R1'], 'columns': [1,5]} - скрыть выбранные строки/столбцы. Columns - индекс, начиная с 1. Rows, columns - не обязательны {'command':'orderRows', 'rows':['R3', 'R1']} - изменить порядок следования строк {'command':'updateRow', 'row':'R3', 'label':'New name'} - редактировать строку {'command':'updateColumn', 'column': 1, 'label':'New name'} - редактировать столбец. Column - индекс, начиная с 1
Примеры
Увеличение счетчика
При каждом заходе на вопрос увеличиваем счетчик на 1, пишем в лог и даем команду показать значение в тексте вопроса пользователю
if (memory.counter === undefined) {
memory.counter = 0;
}
memory.counter++;
console.log('memory.counter: ' + memory.counter);
commands.question.push({'command': 'setLabel', 'value': 'Counter: ' + memory.counter});
Скрытие элементов сетки
Скрыть 2 колонку и стоку с кодом R2
commands.question.push({'command': 'hide', 'rows': ['R2'], 'columns': [2]});
Пример со сбором ответов
Собрать текст с ответами на все уже заданные вопросы и дать команду установить этот текст в комментарий к вопросу, а так же как ответ. Дать команду принять ответ и перейти к следующему вопросу
var text = '';
for(var i in history){
var answer = getAnswer(history[i]);
text += history[i] + ':' + JSON.stringify(answer) + '<br />';
}
commands.question.push({'command':'setComment', 'value':text});
commands.question.push({'command':'setAnswer', 'value':text});
commands.interview.push({'command':'answer'});
Выбор ячейки в сетке
Скрыть 2 колонку и стоку с кодом R2
commands.question.push({'command':'check', 'row':'R2', 'value': 1});
commands.interview.push({'command':'answer'});
Работа с циклом
Вопрос задается в цикле, ничего не делаем на 5 итерации, иначе скрываем все приложенные картинки кроме одной
if (cycle.index == 5)
return;
for(var i = 0; i < media.length; i++) {
if (i + 1 == cycle.index) {
continue;
}
console.log(media[i]);
commands.question.push({'command':'hideMedia', 'value':media[i].name});
}
Операции с вопросом “Выбор вариантов“
Пример операций с вопросом типа Check
commands.question.push({'command':'hideOptions', 'value':['1','2']});
commands.question.push({'command':'updateOption', 'nativeName':'3', 'label':'New name','finisher':false,'excluder':false,'showRespondent':false});
commands.question.push({'command':'orderOptions', 'value':['11','5','4','3']});
commands.question.push({'command':'checkOption', 'value':'3'});
commands.question.push({'command':'checkOption', 'value':'5', 'required':true});
commands.question.push({'command':'checkOption', 'value':'11', 'other': 'Some text'});