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

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

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

примечание

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

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

ТелефонДолжностьКод должностиФИОВозраст
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];

let alert = '<font color="#ce0000">ВНИМАНИЕ!</font>';

if (value === undefined) {
Q.comment = `${alert} В поле «${name}» базы контактов отсутствует значение`;
return ok;
}

let code = parseInt(value, 10);

if (isNaN(code)) {
Q.comment = `${alert} Ошибка в формате значения «${name}» базы контактов
(допускается число, а там «${value}»).`;
return ok;
}

if (Q[code] === undefined) {
Q.comment = `${alert} Отсутствует ответ с кодом ${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];

let alert = '<font color="#ce0000">ВНИМАНИЕ!</font>';

if (value === undefined) {
Q.comment = `${alert} В поле «${name}» базы контактов нет текста`;
return ok;
}

for (let a of Q.getAll()) {
if (a.plainText.toUpperCase() == value.trim().toUpperCase()) {
a.checked = true;
return answered;
}
}

Q.comment = `${alert} Отсутствует ответ для текста «${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];
}

let alert = '<font color="#ce0000">ВНИМАНИЕ!</font>';

if (tag === undefined) {
Q.comment = `${alert} Не найдена метка ни в свойствах базы
контактов, ни в её поле «${name}».`;
return ok;
}

let code = parseInt(tag, 10);
if (isNaN(code)) {
Q.comment = `${alert} Ошибка в формате метки базы контактов
(допускается число, а там «${tag}»).`;
return ok;
}

if (Q[code] === undefined) {
Q.comment = `${alert} Отсутствует ответ с кодом ${code}, который
указан в качестве метки базы контактов.`;
return ok;
}

Q[code].checked = true;

return answered;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

к сведению

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