Часто возникает необходимость, отобразить в вопросе только те варианты ответа, которые респондент выбрал в одном из предыдущих вопросов, или, наоборот, показать только оставшиеся варианты ответа, которые респондент не выбрал. Прочитав эту статью, вы узнаете об общих принципах реализации подобных задач. Стоит отметить, что здесь нет готовых решений для любых случаев, которые могут быть в анкетах. Поняв принцип, вы сможете сделать всё, что задумал разработчик анкеты.
Перед прочтением рекомендуем ознакомиться с этой статьёй.
Обычные вопросы с выбором ответа
Возьмём для примера такой вопрос с множественным выбором:
Q1: Какие магазины Вы посещаете?
1. Магазин А
2. Магазин Б
3. Магазин В
98. Другой (запишите)
99. Затрудняюсь ответить
Далее идёт уточняющий вопрос с единственным выбором:
Q2: Какой магазин, из тех, что Вы посещаете — любимый?
1. Магазин А
2. Магазин Б
3. Магазин В
98. {Q1.98T}
99. Затрудняюсь ответить
То есть в Q1 — один список ответов, а в Q2 — другой. Важно, чтобы коды одних и тех же ответов в обоих списках совпадали. Количество ответов в списках может быть разным.
Показываем выбранные ответы
Чтобы отобразить в Q2 только те варианты ответа, коды которых выбраны в Q1, нужно добавить в Q2 перед показом либо действия, либо скрипт. При этом, допустим, в Q2 ответ 99 должен быть виден в любом случае, поэтому в первую очередь открываем его редактор и ставим флаг Всегда отображается.
- Действия
- Скрипт
- Скрыть все варианты ответа
- Показать варианты ответа, отмеченные в вопросе Q1
- Пропустить, если видно 1 вариантов ответа или строк
Q.answers.hideAll();
Q.answers.show(Q1.getCheckedCodes());
return Q.answers.visibleCount > 1 ? ok : skip;
Всё, этого достаточно.
Последнее действие и строка скрипта нужны для того, чтобы вопрос не задавался, если виден только один ответ (в нашем примере 99 отображается всегда).
Необходимо всегда сначала скрывать все варианты ответа, прежде чем показывать выбранные, так как в случае если респондент будет возвращаться назад и менять ответы в Q1 — в Q2 будут видны невыбранные ответы.
В системе есть возможность скрыть все ответы и показать выбранные одной операцией, и ту же самую задачу можно реализовать так:
- Действия
- Скрипт
- Показать только варианты ответа, отмеченные в вопросе Q1
- Пропустить, если видно 1 вариантов ответа или строк
Q.answers.showOnly(Q1.getCheckedCodes());
return Q.answers.visibleCount > 1 ? ok : skip;
Если требуется автоматически выбирать единственный значимый ответ, то это можно сделать так.
Скрываем выбранные ответы
Чтобы показать в Q2 только оставшиеся варианты ответа, которые респондент не выбрал в Q1, нужно выполнить противоположные операции.
- Действия
- Скрипт
- Показать все варианты ответа
- Скрыть варианты ответа, отмеченные в вопросе Q1
- Пропустить, если видно 0 вариантов ответа или строк
Q.answers.showAll();
Q.answers.hide(Q1.getCheckedCodes());
return Q.answers.visibleCount > 0 ? ok : skip;
Или короче:
- Действия
- Скрипт
- Скрыть только варианты ответа, отмеченные в вопросе Q1
- Пропустить, если видно 1 вариантов ответа или строк
Q.answers.hideOnly(Q1.getCheckedCodes());
return Q.answers.visibleCount > 1 ? ok : skip;
Обычный вопрос с выбором ответа и строки табличного вопроса
Изменим пример: теперь Q2 — табличный вопрос любого типа, где магазины — в строках.
Подробнее
Q2: Что вы можете сказать об этих магазинах?
Список строк:
1. Магазин А
2. Магазин Б
3. Магазин В
98. {Q1.98T}
Показываем выбранные строки
Задача: показать строки, коды которых выбраны в Q1. Точно так же можно использовать или действия, или скрипт перед показом.
- Действия
- Скрипт
- Скрыть все строки
- Показать строки, отмеченные в вопросе Q1
- Пропустить, если видно 0 вариантов ответа или строк
Q.rows.hideAll();
Q.rows.show(Q1.getCheckedCodes());
return Q.rows.visibleCount > 0 ? ok : skip;
Или короче:
- Действия
- Скрипт
- Показать только строки, отмеченные в вопросе Q1
- Пропустить, если видно 0 вариантов ответа или строк
Q.rows.showOnly(Q1.getCheckedCodes());
return Q.rows.visibleCount > 0 ? ok : skip;
Здесь последнее действие и строка скрипта нужны для того, чтобы интервью не прервалось, если нечего показывать (в Q1 выбрали ответ 99 или вопрос вовсе не задавался).
Скрываем выбранные строки
Наверное, вы уже догадались, что нужно делать, чтобы показать в Q2 только оставшиеся строки, коды которых респондент не выбрал в Q1?
- Действия
- Скрипт
- Показать все строки
- Скрыть строки, отмеченные в вопросе Q1
- Пропустить, если видно 0 вариантов ответа или строк
Q.rows.showAll();
Q.rows.hide(Q1.getCheckedCodes());
return Q.rows.visibleCount > 0 ? ok : skip;
Короче:
- Действия
- Скрипт
- Скрыть только строки, отмеченные в вопросе Q1
- Пропустить, если видно 0 вариантов ответа или строк
Q.rows.hideOnly(Q1.getCheckedCodes());
return Q.rows.visibleCount > 0 ? ok : skip;
Обычный вопрос с выбором ответа и ответы табличного вопроса
А что если магазины — варианты ответа табличного вопроса?
Подробнее
Q2: Для каждой характеристики выберите, пожалуйста, наиболее подходящий магазин.
Список строк:
1. Большой ассортимент товаров
2. Находится рядом с домом
3. Самые низкие ценыСписок ответов:
1. Магазин А
2. Магазин Б
3. Магазин В
98. {Q1.98T}
Скрывать и показывать ответы в таблице пока можно только скриптом.
Показываем выбранные ответы
Допустим, нужно показать выбранные в Q1 магазины.
- Скрипт
Q.columns.hideAll();
Q.columns.show(Q1.getCheckedCodes());
return Q.columns.visibleCount > 0 ? ok : skip;
Или короче:
Q.columns.showOnly(Q1.getCheckedCodes());
return Q.columns.visibleCount > 0 ? ok : skip;
Скрываем выбранные ответы
Ну, а чтобы скрыть в табличном вопросе выбранные в Q1 ответы:
- Скрипт
Q.columns.showAll();
Q.columns.hide(Q1.getCheckedCodes());
return Q.columns.visibleCount > 0 ? ok : skip;
Или:
- Скрипт
Q.columns.hideOnly(Q1.getCheckedCodes());
return Q.columns.visibleCount > 0 ? ok : skip;
Два табличных вопроса
Снова изменим пример: теперь Q1 — табличный вопрос с выбором ответа, Q2 — табличный любого типа. В обоих вопросах магазины — в строках.
Подробнее
Q1: Как часто Вы посещаете эти магазины?
Список строк:
- Магазин А
- Магазин Б
- Магазин В
Список ответов:
- Каждый день
- Раз в неделю
- Несколько раз в месяц
- Не посещаю
Q2: Что вы можете сказать об этих магазинах?
Список строк:
- Магазин А
- Магазин Б
- Магазин В
И нам нужно в Q2 показать только те строки, в которых в Q1 выбраны ответы 1 или 2.
- Действия
- Скрипт
- Скрыть все строки
- Показать строки с ответами 1,2 в табличном вопросе Q1
- Пропустить, если видно 0 вариантов ответа или строк
Q.rows.hideAll();
for (let row of Q1.rows.getVisible()) {
if (row.isChecked(1) || row.isChecked(2)) {
Q.rows.show(row.code);
}
}
return Q.rows.visibleCount > 0 ? ok : skip;
Или короче:
- Действия
- Скрипт
- Показать только строки с ответами 1,2 в табличном вопросе Q1
- Пропустить, если видно 0 вариантов ответа или строк
Q.rows.showOnly(Q1.rows.getVisibleCodes()
.filter(rc => Q1.rows[rc].isChecked(1) || Q1.rows[rc].isChecked(2)));
return Q.rows.visibleCount > 0 ? ok : skip;
Показ ответов в порядке выбора
Иногда бывает нужно показать ответы в порядке их выбора в предыдущем вопросе. Для этого можно воспользоваться в скрипте методом getCheckedOrderedCodes():
Q.answers.showOnly(Q1.answers.getCheckedCodes());
Q.answers.setOrder(Q1.answers.getCheckedOrderedCodes());