Система позволяет автоматически проставлять ответы на вопросы анкеты, беря их из базы контактов. Это может быть нужно при проведении телефонных или веб-опросов с уникальными ссылками, например, чтобы посчитать счётчиками интервью с определёнными данными контактов или, чтобы добавить их в массив. Давайте разберёмся какими способами это можно сделать.
Если требуется просто подставить в текст вопроса или ответа значение из базы контактов — читайте эту статью.
Для примера возьмём такой файл с контактами:
Телефон | Должность | Код должности | ФИО | Возраст |
---|---|---|---|---|
79999999900 | Инспектор ульев | 1 | Винни Пух | 35 |
79999999901 | Зав. оружейного склада | 2 | Пятачок | 22 |
79999999902 | Психолог | 3 | Ослик Иа | 42 |
79999999903 | Библиотекарь | 4 | Кролик | 40 |
79999999904 | Главный бухгалтер | 5 | Сова | 64 |
В зависимости от задачи выберите подходящий тип вопроса, в который нужно перенести данные. Например, если основная цель — подсчёт интервью счётчиками, то удобнее использовать вопрос с выбором ответа, потому что для него проще писать условия, чем, например, для текстового. Чаще всего клиенты используют вопросы: Текстовый, Числовой, Единственный выбор.
Как обычно, эту задачу можно решить как действиями, так и скриптами.
Если нужно всего лишь добавить в массив все данные из базы контактов, то при его запросе поставьте флаг Выгружать дополнительные поля с данными из базы контактов.
Одно поле
Рассмотрим перенос одного значения из данных контакта в один вопрос.
Текстовый и числовой вопросы
Допустим, требуется перенести значение из колонки Возраст. Так как в ней есть только числа, то логично использовать числовой вопрос. Добавьте его в анкету, а затем добавьте в этот вопрос следующие действия или скрипт.
При выборе вопроса важно учитывать тип значения, которое должно быть в него помещено. Например, вставить в числовой вопрос текст не получится.
- Действия
- Скрипты
- Нажмите Действия -> Перед показом.
- Нажмите Добавить, выберите действие Загрузить ответы из данных контакта и в длинном поле параметра 1 укажите имя поля (Возраст). Нажмите Сохранить.
- Добавьте ещё одно действие — Пометить как отвеченный или пропустить, но без каких-либо параметров.
Список действий в вопросе будет выглядеть так:
- Загрузить ответы из данных контакта, из полей "Возраст"
- Пометить как отвеченный или пропустить
- Нажмите Скрипты -> Перед показом.
- Вставьте и сохраните такой скрипт:
Q.openValueNum = contact.data['Возраст'];
return Q.isAnswered ? answered : skip;
Подробнее об используемых здесь свойствах и объектах почитать можно по ссылкам: openValueNum, contact, return.
В результате при переходе к этому вопросу число из поля Возраст будет перенесено в него, он будет помечен отвеченным и не выведен на экран. Но если в базе значения не окажется, то вопрос будет просто пропущен.
Если продолжение интервью без ответа на этот вопрос недопустимо, то важно либо убедиться перед запуском опроса, что в базе контактов есть все необходимые данные, либо как-то корректно обработать такую ситуацию (примеры можно найти в следующих подразделах).
Единственный выбор
Теперь давайте перенесём должность респондента, но в вопрос другого типа. В нашем примере файла с контактами есть две колонки, относящиеся к должности: Должность и Код должности. Для выбора ответа можно использовать значения как из первой, так и второй.
Добавьте в анкету вопрос Единственный выбор со списком ответов — всеми возможными должностями.
Выбор ответа по коду
Вставьте скрипт перед показом, и в переменной name
укажите название колонки с кодами ответов (Код должности):
if (isTesting()) return ok;
if (isPostProcessing() || isValidation()) return answered;
let name = 'ИМЯ ПОЛЯ';
let value = contact.data[name];
if (value === undefined) {
informationTextAdd('ВНИМАНИЕ! В поле «{0}» базы контактов отсутствует значение', name);
return ok;
}
let code = parseInt(value, 10);
if (isNaN(code)) {
informationTextAdd('ВНИМАНИЕ! Ошибка в формате значения «{0}» базы контактов ' +
'(допускается число, а там «{1}»).', name, value);
return ok;
}
if (Q[code] === undefined) {
informationTextAdd('ВНИМАНИЕ! Отсутствует ответ с кодом {0}, который ' +
'указан в поле {1} базы контактов.', code, name);
return ok;
}
Q[code].checked = true;
return answered;
Этот скрипт проверяет, есть ли в списке ответов вопроса код из указанного поля. Если есть — выбирает его, помечает вопрос отвеченным и не выводит его на экран. Если вместо кода в поле какое-то неожиданное значение — выводит вопрос на экран и добавляет под список ответов сообщение о возникшей проблеме.
Выбор ответа по тексту
Найти и выбрать вариант ответа можно и по тексту. Важно только учитывать, что тексты в поле базы и у ответа должны совпадать в точности: лишний символ или английская буква вместо русской в слове может помешать найти ответ. А вот регистр (большие или маленькие буквы) значения не имеет.
Вставьте скрипт перед показом, и в переменной name
укажите колонку с названием должностей (Должность):
if (isTesting()) return ok;
if (isPostProcessing() || isValidation()) return answered;
let name = 'ИМЯ ПОЛЯ';
let value = contact.data[name];
if (value === undefined) {
informationTextAdd('ВНИМАНИЕ! В поле «{0}» базы контактов нет текста', name);
return ok;
}
for (let a of Q.getAll()) {
if (a.plainText.toUpperCase() == value.trim().toUpperCase()) {
a.checked = true;
return answered;
}
}
informationTextAdd('ВНИМАНИЕ! Отсутствует ответ для текста «{0}», \
который указан в поле «{1}» базы контактов.', value, name);
Здесь сравнивается текст из поля базы с текстом каждого варианта ответа, и если они совпадут — ответ будет выбран, вопрос пометится отвеченным и не будет выведен на экран. Если ответ выбрать не удастся, то так же, как и в предыдущем скрипте, вопрос будет выеден на экран с сообщением под списком ответов.
Выбор ответа по метке или коду
У базы контактов может быть метка, по которой можно выбирать ответ. Этот скрипт делает практически то же самое, что и скрипт выбора ответа по коду. Но если у базы контактов есть метка, то выбирает ответ с таким же кодом, а если метки нет — код ответа будет взят из поля, название которого указано в переменной name
.
if (isTesting()) return ok;
if (isPostProcessing() || isValidation()) return answered;
let tag = contact.tag;
let name = 'ИМЯ ПОЛЯ';
if (tag === undefined) {
tag = contact.data[name];
}
if (tag === undefined) {
informationTextAdd('ВНИМАНИЕ! Не найдена метка ни в свойствах базы ' +
'контактов, ни в её поле «{0}».', name);
return ok;
}
let code = parseInt(tag, 10);
if (isNaN(code)) {
informationTextAdd('ВНИМАНИЕ! Ошибка в формате метки базы контактов ' +
'(допускается число, а там «{0}»).', tag);
return ok;
}
if (Q[code] === undefined) {
informationTextAdd('ВНИМАНИЕ! Отсутствует ответ с кодом {0}, который ' +
'указан в качестве метки базы контактов.', code);
return ok;
}
Q[code].checked = true;
return answered;
Несколько полей — один вопрос
Бывает, что нужно перенести несколько значений из базы контактов в один вопрос. При переносе одного ответа всё, в целом, очевидно и просто, а при переносе нескольких ответов в один вопрос могут появиться разные нюансы, которые важно учитывать: какие данные и какого типа переносим, а также какие у них названия колонок и можно ли эти названия при необходимости поменять. Скриптами можно сделать практически что угодно, под конкретную задачу, а здесь рассмотрим самый простой способ.
Множественный выбор
Предположим, что нужно перенести имя и должность. Добавьте в анкету вопрос Множественный выбор, а в список ответов — ответы с названиями колонок, откуда будут браться значения. Коды ответов не важны, а вот тексты должны совпадать с названиями полей базы контактов. Поставьте флаг С открытым значением (текст) в этих ответах.
Для нашего файла с контактами ответы будут выглядеть так:
Поле ответа должно поддерживать тип значения, которое будет в него помещено. Вставить в числовое поле текст не получится.
Теперь добавим действия в вопрос, почти как для простых вопросов:
- Нажмите Действия -> Перед показом.
- Нажмите Добавить, выберите действие Загрузить ответы из данных контакта и нажмите Сохранить.
- Добавьте ещё одно действие — Пометить как отвеченный или пропустить.
Список действий в вопросе будет выглядеть так:
- Загрузить ответы из данных контакта
- Пометить как отвеченный или пропустить
В результате при переходе к этому вопросу значения будут перенесены из полей базы контактов, названия которых указаны в вариантах ответа. Вопрос будет помечен отвеченным и не выведен на экран, если заполнено хотя бы одно поле. Если в базе не окажется ни одного значения, то вопрос будет просто пропущен.
Если продолжение интервью без переноса всех значений недопустимо, то важно либо убедиться перед запуском опроса, что в базе контактов есть все необходимые данные, либо как-то корректно обработать такую ситуацию.
Тестирование
Базы контактов находятся в проекте, поэтому нужно загрузить файл с контактами в него, и запускать анкету по рабочей ссылке.
Проверить автоматически проставленные ответы можно в просмотре интервью или в массиве.
В анкете, запущенной в режиме тестирования, базы контактов недоступны.