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

Перенос выбранных ответов из одного вопроса в другой

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

В некоторых анкетах требуется перенести (скопировать) выбранные ответы из одних вопросов в другие. Например, сначала спрашиваем респондента, какие магазины он знает, без подсказки. Затем показываем ему список неназванных им магазинов - возможно, вспомнит ещё какие-то. При этом в массиве, во втором вопросе, должны быть указаны все магазины, которые респондент упомянул. Давайте разбираться, как это сделать.

Два простых вопроса с выбором ответа

Возьмём для начала пример из таких вопросов:

Q1: Какие магазины Вы знаете? (НЕ ПОДСКАЗЫВАТЬ)

1 - Магазин А
2 - Магазин Б
3 - Магазин В

Q2: Какие из этих магазинов Вы знаете? (ПОКАЗАТЬ СПИСОК, ПЕРЕНЕСТИ НАЗВАННОЕ ИЗ Q1)

1 - Магазин А
2 - Магазин Б
3 - Магазин В

Чтобы анкета корректно работала во время заполнения и выбранные ответы не терялись, нам потребуется третий, служебный, вопрос. Делаем копию вопроса Q2, меняем ему номер, например на Q8002, и ставим ему флаг Исключить вопрос при выгрузке, так как в массиве он нам не нужен. Порядок вопросов должен быть таким: Q1, Q8002, Q2.

О принципах скрытия и показа ответов, выбранных в предыдущем вопросе, можно почитать в этой статье - не будем останавливаться здесь подробно. В данном случае в Q8002 нужно сначала показать все варианты ответа и затем скрыть выбранные в Q1.

Теперь добавляем в Q2 действия перед показом, без условий (чтобы выполнялись всегда), в таком порядке:

  1. Сбросить состояние вариантов ответа
  2. Перенести ответы из вопроса Q1
  3. Перенести ответы из вопроса Q8002
  4. Пометить как отвеченный или пропустить

Первое действие необходимо для очистки выбранных ответов. Если его не добавлять, то при возвратах назад во время заполнения и изменении ответов в 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. Чтобы он никогда не выбирался, в действие, которое переносит ответы, можно добавить соответствующее условие, например:

  1. Сбросить состояние вариантов ответа
  2. Если Q1 < 99, то перенести ответы из вопроса Q1
  3. Если Q8002 < 99, то перенести ответы из вопроса Q8002
  4. Пометить как отвеченный или пропустить

Но это не совсем то, что требуется - 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. Перенести магазины с ответом 1

1 - Магазин А
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;