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

Ротация и рандомизация

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

В SURVEYSTUDIO можно использовать как ротацию, так и рандомизацию вопросов или ответов. Но для начала давайте разберёмся, в чём между ними разница.

Ротация — последовательный сдвиг на один шаг вопросов или ответов для каждого следующего интервью. Например, если в первом интервью варианты ответа были показаны в порядке 1,2,3,4, то во втором будут 2,3,4,1, в третьем — 3,4,1,2 и так далее.

Рандомизация — перемешивание вопросов или ответов случайным образом. Важно понимать, что именно случайным (неконтролируемо): одинаковый порядок несколько раз подряд — это нормально, хотя может казаться, что рандомизация не работает.

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

note

Независимо от порядка вопросов и ответов во время заполнения анкеты, в массиве порядок всегда один и тот же: как в редакторе анкеты.

Ответы (строки, колонки)

Чаще всего в анкетах нужно просто перемешать между собой варианты ответа в простом вопросе с выбором или строки таблицы, и сделать это очень просто. Достаточно в редакторе вопроса, на вкладке Опции, поставить необходимый флаг:

  • Рандомизация вариантов ответа (строк) перед показом
  • Ротация вариантов ответа (строк) перед показом

Второй способ — добавить скрипт перед показом:

Q.answers.randomize();
Q.answers.rotate();
В чём разница?

Флаги перемешивают только видимые ответы и визуально (на экране), а скрипт — все и физически. И если вы включите опцию в вопросе и получите массив кодов скриптом Q.answers.getCodes(), то их порядок будет, как в редакторе списка ответов. Если же сделаете перемешивание скриптом — порядок будет такой, как на экране.

tip

Чтобы ответ всегда оставался на своём месте и не перемешивался, в редакторе нужно поставить флаг Не подлежит рандомизации / ротации.

Нюанс рандомизации.

Рандомизация (не ротация) флагом и скриптом перед показом выполняется при каждом показе вопроса: обновили страницу или неправильно заполнили вопрос — ответы (строки) будут перемешаны. И если нужно перемешивание только один раз за интервью, то делать это следует в скрипте Подготовка (с указанием номера вопроса):

Q23.answers.randomize();
note

В скриптах показаны примеры перемешивания ответов в обычном вопросе с выбором. Если вам нужно перемешать строки или варианты ответа в таблице — просто заменяйте answers на rows (строки) или columns (ответы в таблице).

Только заданные коды

Когда необходимо перемешивать только некоторые ответы, а не все, используйте такой скрипт:

Рандомизировать только коды 1, 3 и 5:

Q.answers.randomize([1,3,5]);

Рандомизировать коды с 1 по 10 (имеется ввиду сплошная нумерация: 1,2,3,4…10):

Q.answers.randomizeFromTo(1, 10);

Группы кодов

Иногда бывает нужно перемешивать группы ответов между собой, например 3 блока с кодами 1-3, 4-6 и 7. Это делается так:

Q.answers.randomizeGroups([ [1,3], [4,6], [7,7] ]);

[1,3] буквально означает: взять все ответы между кодами 1 и 3. Это могут быть ответы с любыми кодами, которые находятся внутри: 1, 2, 44, 5… 3.

Одинаковый порядок ответов в двух вопросах

Допустим, требуется перемешать ответы в Q1 и в Q2 вывести их в таком же порядке. Для этого перемешивание в Q1 нужно обязательно сделать скриптом, а выстроить порядок ответов в Q2 можно так:

Q.answers.setOrder(Q1.answers.getCodes());
tip

Воспользовавшись методом setOrder(), вы можете устанавливать ответам (строкам, колонкам) какой угодно порядок, без использования ротации и рандомизации. Например, менять порядок ответов 1,2,3,4,5 на обратный при каждом втором запуске анкеты можно так:

if (rotationCounter % 2 === 0) Q.answers.setOrder([5,4,3,2,1]);

Записать порядок ответов

Если в массиве нужна информация о порядке ответов, который был в момент заполнения вопроса (например, Q34), вначале надо убедиться, что перемешивание сделано скриптом, а не опцией вопроса. Затем добавьте после Q34 текстовый вопрос, в котором будет сохраняться порядок кодов, и скрипт перед показом:

if (Q.isAnswered) return answered;

Q.openValueTxt = Q34.answers.getVisibleCodes().join();

return answered;

Вопросы

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

note

Если вам нужно менять порядок вопросов, в зависимости от какого-то ответа, то это задача на логику и решается переходами от вопроса к вопросу по условию.

Методы ротации и рандомизации вопросов такие же, как у ответов, поэтому просто коротко покажем примеры их использования.

info

Частой ошибкой новичков является прописывание перехода к вопросу, который перемешивается с другими. Например, где-то в середине анкеты меняются местами вопросы 30,31,32, и где-то есть переход к Q30. При запуске анкеты порядок вопросов может быть таким: 31,32,30. Что будет, если мы сразу попадём на Q30? Он будет задан, а Q31 и Q32 окажутся пропущенными. Поэтому важно внимательно прописывать логику переходов.

Только заданные номера

questions.randomize([1,3,5]);
questions.randomizeFromTo(1, 10);

Группы номеров

questions.randomizeGroups([ [1,3], [4,6], [7,7] ]);

Вопросы в цикле

Чтобы перемешать вопросы, находящиеся внутри цикла, можно, конечно, воспользоваться вышеуказанными методами, однако проще всего перед созданием цикла перемешать ответы исходного вопроса. Например:

Q1.answers.randomize();
questions.repeat(2, 3, 1);

Записать порядок вопросов

Представим, что в анкете перемешиваются вопросы 4-8, и нужна информация в массиве о порядке только отвеченных из них.

Для этого добавляем текстовый вопрос со скриптом перед показом:

if (Q.isAnswered) return answered;

let firstQn = 3; // номер вопроса перед Q4
let lastQn = 9; // вопрос после Q8

let numbers = questions.getNumbers();
let start = numbers.indexOf(firstQn) + 1;
let end = numbers.indexOf(lastQn);

let nums = [];
for (let i = start; i < end; i++) {
let Qx = questions[numbers[i]];
if (Qx.isAnswered) nums.push(Qx.number);
}

Q.openValueTxt = nums.join();

return answered;
caution

Если тип проекта будет Внешняя система дозвона или Телефонный опрос, то возможны перезвоны. Значит при повторных запусках анкеты порядок вопросов будет меняться. То есть может быть такое, что ответили на Q5 и перенесли звонок. Перезвонили, вопросы поменялись местами — в текстовом вопросе будет сохранён не совсем тот порядок, который был.

Элементы массива

В скриптах бывает необходимо перемешивать массивы с каким-либо элементами. Для этого в SURVEYSTUDIO есть функция randomizeArray()​.