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

Действие «JS код»

«JS код» — действие в сценарии действий, которое позволяет выполнить произвольный JavaScript-код прямо внутри сценария. Используется там, где встроенных действий не хватает: сложные расчёты, нестандартная обработка строк, работа с массивами, форматирование.

Все переменные сценария доступны через объект varstore. Создавая или меняя свойства varstore, вы изменяете переменные, которые потом видны в блоках и других действиях.

Когда использовать

Когда проще написать 3 строки кода, чем составлять 10 операций из «Операций с данными».

ЗадачаJS код решает за
Преобразование строки (split, replace, regex)1-2 строки
Подсчёт суммы массива1 строка reduce
Форматирование даты в нестандартный вид2-3 строки
Парсинг кастомного формата (CSV-строка, разделители)3-5 строк
Сложная проверка с условиями5-10 строк

Когда не использовать

JS код мощный, но сложнее отлаживается: ошибка в коде = пустые переменные без объяснений.


Часть 1. Как добавить

В сценарии действий → «Добавить действие»«JS код».

Действие 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.

Что дальше