Как поля из JSON массива в memory или lead вывести в сообщение через макропеременные команды "Отправить сообщение"?

Есть такой код

snippet('Business.Surveys.Surveys')

let surveyId = request.json.survey_id
let survey = getSurveyById(surveyId)

memory.setAttr("survey_id", surveyId)
memory.setAttr("survey", survey)

Сообщение

❗️ У вас назначен новый опрос ❗️

📅 Опрос: {{ &$survey.title }} (ID: {{ &$survey_id }})
📋 Описание: {{ &$survey.description }}
👨‍⚕️ Автор опроса: {{ &$survey.author }}
🏫 Группа: {{ &$survey.group_name }}

Пожалуйста, ознакомьтесь с опросом и не забудьте ответить вовремя!

В результате получаю

❗️ У вас назначен новый опрос ❗️

📅 Опрос:  (ID: 1)
📋 Описание: 
👨‍⚕️ Автор опроса: 
🏫 Группа:  

Пожалуйста, ознакомьтесь с опросом и не забудьте ответить вовремя!

Почему не выводится содержимое объекта survey? Такое воообще возможно в Metabot или надо каждое поле отдельно совать в memory?

Код плагина

snippet('Business.Helpers.Response')
snippet('Business.Helpers.Notifications')

/** 
 * Получает данные об опросе по его ID.
 * @param {number} surveyId - ID опроса.
 * @returns {Object} Ответ с результатами в формате JSON.
 */
function getSurveyById(surveyId) {
    // Ищем опрос по ID в таблице surveys
    let survey = table.find('surveys', [], [['id', '=', surveyId]]);
    
    if (survey.length === 0) {
        return getErrorResponse("Опрос с таким ID не найден.");
    }

    // Извлекаем данные опроса
    survey = survey[0]; // Получаем первый элемент (он один, так как ID уникальный)
    
    // Формируем ответ с данными опроса в формате JSON
    let surveyData = {
        id: survey.id,
        group_id: survey.group_id,
        group_name: survey.group_name, 
        title: survey.title,
        description: survey.description,
        author_id: survey.author_id,
        author: survey.author_first_name + " " + survey.author_last_name,
        status_id: survey.status_id,
        status_name: survey.survey_status_name,
        created_at: survey.created_at,
        updated_at: survey.updated_at
    };

    // Возвращаем ответ с данными опроса в формате JSON
    return surveyData;
}

Функция возвращает такую структуру

{
    "id": 1,
    "group_id": 1,
    "group_name": "001",
    "title": "Опрос тестовый",
    "description": "Какая у вас погода?",
    "author_id": 1,
    "author": "Иван Иванов",
    "status_id": 1,
    "status_name": "Активен",
    "created_at": "2025-02-11 08:56:11",
    "updated_at": null
}

Как в Show Message команде указать макропеременные массива из memory или lead?

Спасибо за помощь.

setAttr - для установки строки
setJsonAttr - для установки json

вам нужно создать json обьект (по аналогии как это делается в плагине) и записать его в memory

const surveyData = 
{
    id: survey.id,
    group_id: survey.group_id,
    group_name: survey.group_name, 
    title: survey.title,
    description: survey.description,
    author_id: survey.author_id,
    author: survey.author_first_name + " " + survey.author_last_name,
    status_id: survey.status_id,
    status_name: survey.survey_status_name,
    created_at: survey.created_at,
    updated_at: survey.updated_at
}

memory.setJsonAttr('survey', surveyData)

для обращения к json полям в отправляемом сообщении используем &$$
(или без амперсанда $$ если это lead jsonAttr сохраненный в бд, а атрибутах лида)

например

Автор опроса: {{ &$$survey.author }}

PS: передавать обьекты напрямую кудато не нельзя, кроме как в функцию debug(), тк записи полученные через table.find это не json, это обьекты, v8 обертки над обьектами, по аналогии как обьект lead / person и т.д.

1 лайк

Спасибо за помощь! Все получилось с помощью setJsonAttr() и &&$

Кому полезно, вот финальный код:

snippet('Business.Surveys.Surveys')

let surveyId = request.json.survey_id
let survey = getSurveyById(surveyId)

memory.setJsonAttr("survey", survey)

Sent Text:

❗️ У вас назначен новый опрос ❗️

📅 Опрос: {{ &$$survey.title }} (ID: {{ &$$survey.id }})
📋 Описание: {{ &$$survey.description }}
👨‍⚕️ Автор опроса: {{ &$$survey.author }}
🏫 Группа: {{ &$$survey.group_name }}

Пожалуйста, ознакомьтесь с опросом и не забудьте ответить вовремя!

Результат:

❗️ У вас назначен новый опрос ❗️

📅 Опрос: Опрос тестовый (ID: 1)
📋 Описание: Какая у вас погода?
👨‍⚕️ Автор опроса: Иван Иванов 
🏫 Группа: 001 

Пожалуйста, ознакомьтесь с опросом и не забудьте ответить вовремя!