В некоторых анкетах требуется перенести (скопировать) выбранные ответы из одних вопросов в другие. Например, сначала спрашиваем респондента, какие магазины он знает, без подсказки. Затем показываем ему список неназванных им магазинов - возможно, вспомнит ещё какие-то. При этом в массиве, во втором вопросе, должны быть указаны все магазины, которые респондент упомянул. Давайте разбираться, как это сделать.
Два простых вопроса с выбором ответа
Возьмём для начала пример из таких вопросов:
Q1: Какие магазины Вы знаете? (НЕ ПОДСКАЗЫВАТЬ)
1 - Магазин А
2 - Магазин Б
3 - Магазин ВQ2: Какие из этих магазинов Вы знаете? (ПОКАЗАТЬ СПИСОК, ПЕРЕНЕСТИ НАЗВАННОЕ ИЗ Q1)
1 - Магазин А
2 - Магазин Б
3 - Магазин В
Чтобы анкета корректно работала во время заполнения и выбранные ответы не терялись, нам потребуется третий, служебный, вопрос. Делаем копию вопроса Q2, меняем ему номер, например на Q8002, и ставим ему флаг Исключить вопрос при выгрузке, так как в массиве он нам не нужен. Порядок вопросов должен быть таким: Q1, Q8002, Q2.
О принципах скрытия и показа ответов, выбранных в предыдущем вопросе, можно почитать в этой статье - не будем останавливаться здесь подробно. В данном случае в Q8002 нужно сначала показать все варианты ответа и затем скрыть выбранные в Q1.
Теперь добавляем в Q2 действия перед показом, без условий (чтобы выполнялись всегда), в таком порядке:
- Сбросить состояние вариантов ответа
- Перенести ответы из вопроса Q1
- Перенести ответы из вопроса Q8002
- Пометить как отвеченный или пропустить
Первое действие необходимо для очистки выбранных ответов. Если его не добавлять, то при возвратах назад во время заполнения и изменении ответов в Q1 или в Q8002, в Q2 будут только добавляться ранее невыбранные ответы, а те, что были выбраны, но их убрали, так и останутся выбранными.
Действия 2 и 3 просто копируют ответы из указанных вопросов. Если в списке ответов нет соответствующих кодов - они игнорируются.
Четвёртое действие позволяет не выводить на экран вопрос в любом случае: есть в нём ответ или нет. Здесь важно убедиться, что анкета работает верно с возможными сценариями опроса.
Теперь во время заполнения анкеты на экран будут выводиться Q1 и Q8002, а Q2 будет заполняться автоматически ответами из этих двух вопросов. Проверить правильность работы можно по дампу ответов, который виден после завершения тестового интервью.
Усложним пример:
Q1: Какие магазины Вы знаете? (НЕ ПОДСКАЗЫВАТЬ)
1 - Магазин А
2 - Магазин Б
3 - Магазин В
98 - Другой (ЗАПИШИТЕ)
99 - Затрудняюсь ответить (ИСКЛЮЧАЮЩИЙ)Q2: Какие из этих магазинов Вы знаете? (ПОКАЗАТЬ СПИСОК, ПЕРЕНЕСТИ НАЗВАННОЕ ИЗ Q1)
1 - Магазин А
2 - Магазин Б
3 - Магазин В
98 - Другой (ЗАПИШИТЕ)
99 - Затрудняюсь ответить (ИСКЛЮЧАЮЩИЙ)
В чём отличие от первого примера? Добавились ответы 98 и 99, и с ними будет проблема, если всё сделать так же, как описано выше. При выборе ответа 98 в обоих вопросах и вписывании разных магазинов, как их объединить в один ответ и как потом, например, оценить это по 5-тибальной шкале, ведь фактически это будут магазины Г и Д с одним кодом? Это частая ошибка разработчиков анкет. Не должно быть у разных ответов одинаковых кодов, это приводит к путанице.
Если в Q1 респондент выберет ответ 99, а в Q2 - любой другой ответ, система их, конечно, перенесёт, но так как 99 - исключающий, то есть вместе с ним не может быть выбрано других ответов, только он и останется в массиве.
Добавляем наш служебный Q8002 и меняем списки ответов:
Q1: Какие магазины Вы знаете?
1 - Магазин А
2 - Магазин Б
3 - Магазин В
97 - Другой (ЗАПИШИТЕ)
99 - Затрудняюсь ответить (ИСКЛЮЧАЮЩИЙ)Q8002: Какие из этих магазинов Вы знаете?
1 - Магазин А
2 - Магазин Б
3 - Магазин В
98 - Другой (ЗАПИШИТЕ)
99 - Затрудняюсь ответить (ИСКЛЮЧАЮЩИЙ)Q2: Какие из этих магазинов Вы знаете?
1 - Магазин А
2 - Магазин Б
3 - Магазин В
97 - Другой (ЗАПИШИТЕ)
98 - Другой (ЗАПИШИТЕ)
99 - Затрудняюсь ответить (ИСКЛЮЧАЮЩИЙ)
Проблема с открытым ответом 98 решена, осталось разобраться с исключающим, 99. Чтобы он никогда не выбирался, в действие, которое переносит ответы, можно добавить соответствующее условие, например:
- Сбросить состояние вариантов ответа
- Если Q1 < 99, то перенести ответы из вопроса Q1
- Если Q8002 < 99, то перенести ответы из вопроса Q8002
- Пометить как отвеченный или пропустить
Но это не совсем то, что требуется - Q2 может остаться вообще без ответа, хотя в таком случае в нём должен быть выбран ответ 99. Можно после третьего действия добавить ещё одно, которое перенесёт ответ 99:
- Если Q1 = 99 and Q8002 = 99, то перенести ответы из вопроса Q1
То есть если в обоих вопросах выбран код 99, то переносим его из Q1 (или Q8002 - в данном случае не имеет значения).
Вместо действий можно использовать этот скрипт. Он позволяет указать коды, которые переносить не нужно, а затем можно выбрать их при определённых условиях. Например, для второго примера функцию copyAnswers() можно вызывать так:
copyAnswers(1, [99]);
copyAnswers(8002, [99]);
if (!Q.isAnswered && Q1.isChecked(99)) Q[99].checked = true;
Табличный вопрос и простой с выбором ответа
Допустим, нужно перенести магазины, у которых выбран ответ 1, в обычный вопрос с выбором ответа:
Q1. Пользуетесь ли Вы следующими сервисами?
Список строк:
1 - Магазин А
2 - Магазин Б
3 - Магазин ВСписок ответов:
1 - Да
2 - Нет
СКРЫТАЯ ПЕРЕМЕННАЯ
Q2. Перенести магазины с ответом 11 - Магазин А
2 - Магазин Б
3 - Магазин В
Сделать это можно только скриптом, перед показом Q2.
- С комментариями
- Без комментариев
// сбрасываем состояние вопроса в исходный вид (очищаем)
Q.reset();
// проходим по видимым строкам Q1
for (let row of Q1.rows.getVisible()) {
// если вдруг такого кода строки нет в списке ответов, то пропускаем его
if (!(row.code in Q.answers)) continue;
// если в строке выбран ответ 1, то выбираем ответ с таки же кодом
if (row.isChecked(1)) Q[row.code].checked = true;
}
// помечаем вопрос как отвеченный или пропускаем
return Q.isAnswered ? answered : skip;
Q.reset();
for (let row of Q1.rows.getVisible()) {
if (!(row.code in Q.answers)) continue;
if (row.isChecked(1)) Q[row.code].checked = true;
}
return Q.isAnswered ? answered : skip;