Показать в вопросе только те варианты ответа, которые отметили в предыдущем вопросе

Часто возникает необходимость, отобразить в вопросе только те варианты ответа, которые респондент выбрал в одном из предыдущих вопросов, или наоборот - показать только оставшиеся варианты ответа, которые респондент не выбрал.

Самый простой способ сделать подобное - использовать Действия перед показом вопроса. Например, у нас есть вопрос с множественным выбором (вариант ответа 99 помечен флагом Блокирующий):

Q1: Какие магазины Вы посещаете?

1 - Магазин А
2 - Магазин Б
3 - Магазин В
98 - Другой (запишите)
99 - Затрудняюсь ответить

Далее идет уточняющий вопрос с единственным выбором:

Q2: Какой магазин, из тех, что Вы посещаете - любимый?

1 - Магазин А
2 - Магазин Б
3 - Магазин В
98 - {Q1.98T}

То есть в Q1 будет один список ответов, а в Q2 - другой. Важно, чтобы коды одних и тех же ответов в обоих списках совпадали. Количество ответов в списках может быть разным.

Для вопроса Q2 надо не забыть прописать условие показа, чтобы он не задавался, когда в Q1 отметили код 99. Например, сделать в Q1 после ответа переход куда-то далее, через Q2, или у самого Q2 прописать условие показа Q1 < 99.

Чтобы отобразить в Q2 только те варианты ответа, коды которых выбраны в Q1, добавляем в Q2 два действия перед показом:

  • Скрыть все варианты ответа
  • Показать варианты ответа, отмеченные в вопросе Q1

либо используем одно действие, заменяющее два указанных выше:

  • Показать только варианты ответа, отмеченные в вопросе Q1

Действия добавляются без указания условия. Всё, этого достаточно. Если в Q2 есть исключающие варианты ответа, например Затрудняюсь ответить, то в свойствах этих ответов надо не забыть поставить флаг Всегда отображается.

Важный момент - необходимо всегда сначала скрывать все варианты ответа, прежде чем показывать необходимые (и наоборот, в зависимости от задачи), т.к. вопрос перед показом не сбрасывается в исходное состояние, и в случае если оператор будет ходить по анкете назад и менять ответы в Q1 - будет странный результат. Это не касается действий вроде Показать только варианты ответа, отмеченные в вопросе, т.к. они сами выполняют всё необходимое.

Всё то же самое можно, конечно, сделать и скриптами. Вместо действий, пишем в Q2 в скрипт перед показом:

Q.answers.hideAll();
Q.answers.show(Q1.getCheckedCodes());

или проще:

Q.answers.showOnly(Q1.getCheckedCodes());
return Q.answers.hasVisible ? ok : skip;

Тут мы сразу проверяем, есть ли в итоге какие-то ответы для показа, и если их не осталось - пропускаем вопрос. Сделать такую же проверку можно и действием

  • Пропустить, если нет видимых вариантов ответа или строк

Если наш вопрос Q2 - это табличный вопрос, и надо показать только те строки, коды которых отмечены в Q1, то это сделать можно только скриптом перед показом для Q2:

Q.rows.hideAll();
Q.rows.show(Q1.getCheckedCodes());
return Q.rows.hasVisible ? ok : skip;

или так:

Q.rows.showOnly(Q1.getCheckedCodes());
return Q.rows.visibleCount > 0 ? ok : skip;

Ещё один встречающийся случай - показать в табличном вопросе только те строки, для которых также в табличном вопросе, например в Q1, отметили код 1 или 2:

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.hasVisible ? ok : skip;

Комментарии