Действие «JS код»
«JS код» — действие в сценарии действий, которое позволяет выполнить произвольный JavaScript-код прямо внутри сценария. Используется там, где встроенных действий не хватает: сложные расчёты, нестандартная обработка строк, работа с массивами, форматирование.
Все переменные сценария доступны через объект varstore. Создавая или меняя свойства varstore, вы изменяете переменные, которые потом видны в блоках и других действиях.
Когда использовать
Когда проще написать 3 строки кода, чем составлять 10 операций из «Операций с данными».
| Задача | JS код решает за |
|---|---|
| Преобразование строки (split, replace, regex) | 1-2 строки |
| Подсчёт суммы массива | 1 строка reduce |
| Форматирование даты в нестандартный вид | 2-3 строки |
| Парсинг кастомного формата (CSV-строка, разделители) | 3-5 строк |
| Сложная проверка с условиями | 5-10 строк |
Когда не использовать
- Простые арифметические выражения — лучше
{{ #{x} + #{y} }}. - Проверка типа значения — встроенные проверки в «Операциях с данными».
- HTTP-запрос — отдельное действие HTTP, там есть тестирование.
- Чтение/запись списков — «Операции с данными».
JS код мощный, но сложнее отлаживается: ошибка в коде = пустые переменные без объяснений.
Часть 1. Как добавить
В сценарии действий → «Добавить действие» → «JS код».
Скриншот 1. Поле для JS-кода.
В поле введите код. Лимит — 1 000 000 символов (хватит на тысячи строк).
Часть 2. Работа с переменными через varstore
Все локальные переменные сценария живут в объекте varstore. Это словарь: ключ — имя переменной, значение — её содержимое.
Прочитать переменную
const name = varstore['client_name'];
const age = +varstore['client_age']; // приведение к числу
Если переменная не задана — будет undefined.
Создать / изменить переменную
varstore['order_total'] = 1500;
varstore['greeting'] = 'Здравствуйте, ' + varstore['client_name'];
После выполнения JS-кода эти переменные доступны в блоке как #{order_total}, #{greeting} и в следующих действиях.
Работа с массивами
const items = varstore['cart_items']; // массив
const total = items.reduce((sum, x) => sum + (+x.price), 0);
varstore['cart_total'] = total;
Часть 3. Подстановка шаблонов в коде
В JS-код можно подставлять и шаблоны замен, и переменные через #{...} — Квесча подставит их до выполнения кода.
const userName = '[Name]';
const today = '[CurrentDate]';
const price = #{price};
varstore['greeting'] = `Привет, ${userName}! Сегодня ${today}, ваша цена: ${price} ₽`;
При выполнении это превратится, например, в:
const userName = 'Иван';
const today = '21.08.2026';
const price = 1500;
Подстановка идёт текстом. [Name] без кавычек станет переменной JS, а нужна строка — оборачивайте в кавычки: '[Name]'. Числовые #{price} — без кавычек, если уверены, что это число.
Часть 4. Типовые примеры
Пример 1. Сумма скидки
Дано: #{order_sum} и #{discount_percent}. Нужно посчитать сумму со скидкой.
const sum = +varstore['order_sum'];
const discount = +varstore['discount_percent'];
varstore['order_final'] = Math.round(sum * (1 - discount / 100));
В блоке: Итого со скидкой: #{order_final} ₽.
Пример 2. Извлечение города из адреса
Дано: [Answer3] = «Москва, ул. Ленина, 1». Нужно вытащить город.
const addr = '[Answer3]';
varstore['city'] = addr.split(',')[0].trim();
Пример 3. Маска телефона
const raw = ('[Answer2]' || '').replace(/\D/g, '');
const norm = raw.startsWith('8') ? '7' + raw.slice(1) : raw;
varstore['client_phone'] = '+' + norm;
Пример 4. Дата в формате «1 сентября»
const months = ['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'];
const d = new Date();
varstore['date_pretty'] = `${d.getDate()} ${months[d.getMonth()]}`;
Пример 5. Случайный элемент массива
Дано: глобальная переменная g_promos = ["SUMMER10", "WELCOME20", "FRIEND15"].
const list = varstore['g_promos'];
varstore['random_promo'] = list[Math.floor(Math.random() * list.length)];
Пример 6. Подсчёт длины списка после фильтра
После чтения списка у вас массив #{found_items}.
const items = varstore['found_items'] || [];
varstore['items_count'] = items.length;
varstore['has_items'] = items.length > 0 ? 1 : 0;
Пример 7. Сборка JSON для HTTP-запроса
varstore['payload_json'] = JSON.stringify({
name: varstore['client_name'],
phone: varstore['client_phone'],
amount: +varstore['order_sum'],
date: new Date().toISOString()
});
В HTTP-запросе → тело: #{payload_json}.
Часть 5. Что доступно в коде
Доступно
- Стандартный JavaScript (ES2020+);
Math,Date,JSON,Array,Object,String,Number,RegExp;parseInt,parseFloat,isNaN;- объект
varstoreдля переменных.
Недоступно (по соображениям безопасности)
require(),import— внешние модули;fs,child_process— файловая система и процессы;- сетевые запросы из JS-кода — используйте отдельное действие HTTP;
eval(),Function()— конструкторы динамического кода;- доступ к глобальным объектам сервера.
Если нужна сеть — выполните HTTP-запрос до JS-кода, сохраните результат в переменную, в JS-коде разбирайте уже её.
Часть 6. Архитектура
Принцип 1. Маленькие куски, а не «всё в одном»
Не пишите 200-строчный скрипт. Разбейте на:
- JS код #1: преобразовать данные;
- HTTP запрос между ними;
- JS код #2: обработать ответ.
Принцип 2. Комментируйте ввод/вывод
В начале кода — список ожидаемых входов, в конце — что записано в varstore:
// Вход: varstore['order_sum'] (число), varstore['discount'] (0-100)
// Выход: varstore['order_final'] (число)
Принцип 3. Защищайтесь от пустых значений
const raw = varstore['client_phone'] || '';
if (!raw) {
varstore['phone_error'] = 1;
return;
}
Принцип 4. Используйте + для приведения к числу
В varstore всё строки. Перед арифметикой: const n = +varstore['x'] или const n = parseFloat(varstore['x']).
Принцип 5. Не дублируйте функционал
Если простую вещь можно сделать выражением {{ }} или «Операцией с данными» — делайте там. JS — для нестандартного.
Частые ошибки
- Переменная пустая после кода — опечатка в имени
varstore['vаrname'](русская «а»). Скопируйте имя из «Операций с данными». NaNилиundefinedв результате — забыли привести строку к числу через+илиparseFloat.- Код падает без сообщения — Квесча тихо прерывает выполнение. Проверьте через
console.log(видно в логах) или сохраняйте промежуточные значения вvarstore. - Подстановка
[Answer]без кавычек — превращается в JS-выражение и ломает синтаксис. Оборачивайте:'[Answer]'. - Использовали
awaitдляfetchилиaxios— недоступно. Сделайте HTTP-действием отдельно. - Регулярка ест эмодзи / Unicode — добавьте флаг
u:/.../gu.
Что дальше
- Операции с данными — встроенные операции, чаще достаточно их.
- HTTP-запросы — если нужна сеть.
- Шаблоны замен — встроенные функции
[Round(...)],[SumInWords(...)],[DiffDates(...)]могут заменить JS. - Переменные и списки — что в JS-коде передаётся через
varstore.