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

Перенос ответа на вопрос из базы контактов

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

Система позволяет автоматически проставлять ответы на вопросы анкеты, беря их из базы контактов. Это может быть нужно при проведении телефонных или веб-опросов с уникальными ссылками, например, чтобы посчитать счётчиками интервью с определёнными данными контактов или, чтобы добавить их в массив. Давайте разберёмся какими способами это можно сделать.

примечание

Если требуется просто подставить в текст вопроса или ответа значение из базы контактов — читайте эту статью.

Для примера возьмём такой файл с контактами:

ТелефонДолжностьКод должностиФИОВозраст
79999999900Инспектор ульев1Винни Пух35
79999999901Зав. оружейного склада2Пятачок22
79999999902Психолог3Ослик Иа42
79999999903Библиотекарь4Кролик40
79999999904Главный бухгалтер5Сова64

В зависимости от задачи выберите подходящий тип вопроса, в который нужно перенести данные. Например, если основная цель — подсчёт интервью счётчиками, то удобнее использовать вопрос с выбором ответа, потому что для него проще писать условия, чем, например, для текстового. Чаще всего клиенты используют вопросы: Текстовый, Числовой, Единственный выбор.

Как обычно, эту задачу можно решить как действиями, так и скриптами.

подсказка

Если нужно всего лишь добавить в массив все данные из базы контактов, то при его запросе поставьте флаг Выгружать дополнительные поля с данными из базы контактов.

Одно поле

Рассмотрим перенос одного значения из данных контакта в один вопрос.

Текстовый и числовой вопросы

Допустим, требуется перенести значение из колонки Возраст. Так как в ней есть только числа, то логично использовать числовой вопрос. Добавьте его в анкету, а затем добавьте в этот вопрос следующие действия или скрипт.

предупреждение

При выборе вопроса важно учитывать тип значения, которое должно быть в него помещено. Например, вставить в числовой вопрос текст не получится.

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

Список действий в вопросе будет выглядеть так:

  • Загрузить ответы из данных контакта, из полей "Возраст"
  • Пометить как отвеченный или пропустить

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

предупреждение

Если продолжение интервью без ответа на этот вопрос недопустимо, то важно либо убедиться перед запуском опроса, что в базе контактов есть все необходимые данные, либо как-то корректно обработать такую ситуацию (примеры можно найти в следующих подразделах).

Единственный выбор

Теперь давайте перенесём должность респондента, но в вопрос другого типа. В нашем примере файла с контактами есть две колонки, относящиеся к должности: Должность и Код должности. Для выбора ответа можно использовать значения как из первой, так и второй.

Добавьте в анкету вопрос Единственный выбор со списком ответов — всеми возможными должностями.

Выбор ответа по коду

Вставьте скрипт перед показом, и в переменной 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;

Несколько полей — один вопрос

Бывает, что нужно перенести несколько значений из базы контактов в один вопрос. При переносе одного ответа всё, в целом, очевидно и просто, а при переносе нескольких ответов в один вопрос могут появиться разные нюансы, которые важно учитывать: какие данные и какого типа переносим, а также какие у них названия колонок и можно ли эти названия при необходимости поменять. Скриптами можно сделать практически что угодно, под конкретную задачу, а здесь рассмотрим самый простой способ.

Множественный выбор

Предположим, что нужно перенести имя и должность. Добавьте в анкету вопрос Множественный выбор, а в список ответов — ответы с названиями колонок, откуда будут браться значения. Коды ответов не важны, а вот тексты должны совпадать с названиями полей базы контактов. Поставьте флаг С открытым значением (текст) в этих ответах.

Для нашего файла с контактами ответы будут выглядеть так:

Список ответов

предупреждение

Поле ответа должно поддерживать тип значения, которое будет в него помещено. Вставить в числовое поле текст не получится.

Теперь добавим действия в вопрос, почти как для простых вопросов:

  1. Нажмите Действия -> Перед показом.
  2. Нажмите Добавить, выберите действие Загрузить ответы из данных контакта и нажмите Сохранить.
  3. Добавьте ещё одно действие — Пометить как отвеченный или пропустить.

Список действий в вопросе будет выглядеть так:

  • Загрузить ответы из данных контакта
  • Пометить как отвеченный или пропустить

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

предупреждение

Если продолжение интервью без переноса всех значений недопустимо, то важно либо убедиться перед запуском опроса, что в базе контактов есть все необходимые данные, либо как-то корректно обработать такую ситуацию.

Тестирование

Базы контактов находятся в проекте, поэтому нужно загрузить файл с контактами в него, и запускать анкету по рабочей ссылке.

Проверить автоматически проставленные ответы можно в просмотре интервью или в массиве.

к сведению

В анкете, запущенной в режиме тестирования, базы контактов недоступны.