С помощью инструмента «Запуск JavaScript кода» вы можете добавить произвольный JS-код в связку. Запускаться будет тот код, который вы самостоятельно напишите в настройках этого шага.
Принцип работы инструмента
Сначала настраиваются «входные данные». Вы создаёте переменные, называете их и указываете, какие значения нужно «положить» в эти переменные. После этого в коде можно работать с этими переменными, а также создавать новые.
Далее нужно настроить «выходные данные»: вручную прописывается имя переменной, которую необходимо получить на выходе, и задаётся тип этой переменной. Во всех следующих шагах связки вам будут доступны поля, которые вы настроите в «выходных данных».
fetch, она не сработает — эта команда отключена по соображениям безопасности.Пример настройки и использования инструмента
Чтобы добавить «Запуск JavaScript кода» в связку, нажмите «Добавить действие» и выберите сервис «JavaScript».

Затем во «входных данных» объявите переменные: дайте им имена и укажите, из каких предыдущих шагов подставлять значения.

Чтобы добавить больше переменных, нажмите «Добавить поле». Лишние переменные можно удалить.

После этого напишите любой код на JavaScript, используя объявленные переменные или создавая новые на их основе.

Если вы хотите на выходе получить значение переменной outputData (результат работы скрипта), укажите её имя в разделе «выходные данные» и задайте тип переменной.

Как и во «входных данных», можно создавать несколько переменных. Описывать «выходные данные» нужно обязательно — даже если вы не создали в коде новых переменных. Этот раздел сообщает шагу, какие поля будут использоваться дальше и какие значения в них придут. Нажмите «Сохранить».
В последующих шагах вы увидите поля, которые настроили в «выходных данных», и сможете использовать их дальше в связке.

Если код не удалось выполнить по каким-либо причинам, шаг считается ошибочным. В журнале отобразится ошибка от JS-движка.
Примеры кода
Кейс 1. Вычислить разницу между датами в минутах
Вычесть из даты и времени начала дату и время окончания и вывести результат в минутах.
dateEnd = new Date(dateEnd);
let difMinutes = (dateEnd — dateStart) / (1000 * 60);

Кейс 2. Разбивка даты и времени на два параметра с обрезкой секунд
Разбиваем параметр «Дата и время» (unix) на два параметра: отдельно дату и отдельно время. Секунды обрезаем, оставляем формат ЧЧ:ММ.
return arr.map((el) => {
return el < 10 ? «0» + el : el; }); } let date = dateEdit([ dateTime.getDate(), dateTime.getMonth() + 1, dateTime.getFullYear(), ]).join(«.»); let time = dateEdit([dateTime.getHours(), dateTime.getMinutes()]).join(«:»);

Кейс 3. Разбивка одного параметра на два по разделителю
Разбивка по пробелу:
let name = A[0];
let surname = A?.[1];
Разбивка нескольких значений с разделителем «пробел»:
let name = num4[0];
let familyname = num4?.[1];
let surname = num4?.[2];
Разбивка с разделителем «запятая»:
let num1 = A[0];
let num2 = A?.[1];
Разбивка по символу «|»:
let name = UF_CRM_1669820909984[0];
let surname = UF_CRM_1669820909984?.[1];

Кейс 4. Получение массива данных из URL
Парсинг параметров из строки запроса. Входное значение подставьте на место url в последней строке. На выход принимайте parsedGet с типом StringArray.
const queryString = url.split(«?»)[1];
if (!queryString) {
return {};
}const queryParams = {};
const pairs = queryString.split(«&»);
for (let i = 0; i < pairs.length; i++) { const pair = pairs[i].split(«=»); const key = decodeURIComponent(pair[0]); const value = decodeURIComponent(pair[1] || «»); if (queryParams.hasOwnProperty(key)) { if (Array.isArray(queryParams[key])) { queryParams[key].push(value); } else { queryParams[key] = [queryParams[key], value]; } } else { queryParams[key] = value; } } return queryParams; } const parsedGet = parseQueryParams(url); // Дополнительно — получить отдельные параметры: let one = parsedGet[0]; let two = parsedGet[1];

Кейс 5. Очистка текста от HTML-тегов
Удаляет HTML-теги, лишние переносы строк и пробелы из текста письма.
html = html.replace(regexp, »).trim();

Кейс 6. Перевод даты и времени в Unix-формат
let [year, month, day] = date.split(«-«).map(Number);
let [hours, minutes, seconds] = time.split(«:»).map(Number);
let ls_deadline_unix = new Date(year, month — 1, day, hours, minutes, seconds).getTime();

Кейс 7. Работа с мультисписками: вывести значение вместо кода
Если поле хранит числовой код из мультисписка, а вам нужно текстовое значение — задайте соответствие в объекте и получите результат по ключу.
Пример структуры кода: создайте объект с парами «код: значение» и обратитесь к нему по входному параметру.
Кейс 8. Условная логика по дням недели
Связка отправляет разные сообщения в зависимости от дня недели.
0: ‘текст воскресенья’,
1: ‘текст понедельника’,
2: ‘текст вторника’,
3: ‘текст среды’,
4: ‘текст четверга’,
5: ‘текст пятницы’,
6: ‘текст субботы’,
};
const result = compare[new Date().getDay()];

Кейс 9. Форматирование ФИО: первые буквы заглавными
if (!str) {
return str;
}const formattedString = str.trim().toLowerCase();
return formattedString
.split(» «)
.map(elem => elem[0].toUpperCase() + elem.slice(1))
.join(» «);
}
const outString = toCapitalLetter(str);

Кейс 10. Получить диапазон дат за предыдущую неделю
Связка запускается в понедельник и получает две даты для отчёта: семь дней назад и вчера.
let date = new Date(inputDate);// Форматирование даты в «ДД-ММ-ГГГГ»
let formattedDate = `${String(date.getDate()).padStart(2, ‘0’)}-${String(date.getMonth() + 1).padStart(2, ‘0’)}-${date.getFullYear()}`;
// Дата начала (на 7 дней раньше)
let startDate = new Date(date);
startDate.setDate(date.getDate() — 7);
let formattedStartDate = `${String(startDate.getDate()).padStart(2, ‘0’)}-${String(startDate.getMonth() + 1).padStart(2, ‘0’)}-${startDate.getFullYear()}`;
// Дата окончания (на 1 день раньше)
let endDate = new Date(date);
endDate.setDate(date.getDate() — 1);
let formattedEndDate = `${String(endDate.getDate()).padStart(2, ‘0’)}-${String(endDate.getMonth() + 1).padStart(2, ‘0’)}-${endDate.getFullYear()}`;
return { formattedStartDate, formattedEndDate };
}
let dateStart = transformDate(date).formattedStartDate;
let dateEnd = transformDate(date).formattedEndDate;
Кейс 11. Получить начало и конец предыдущих суток
Код возвращает вчерашнюю дату в трёх форматах: простую строку ГГГГ-ММ-ДД, начало дня (00:00) и конец дня (23:59) в ISO-формате. Удобно для выгрузки данных за вчерашний день.
const yesterday = new Date();
yesterday.setDate(today.getDate() — 1);// Простая дата (YYYY-MM-DD)
const yyyy = yesterday.getFullYear();
const mm = String(yesterday.getMonth() + 1).padStart(2, ‘0’);
const dd = String(yesterday.getDate()).padStart(2, ‘0’);
const formattedDate = `${yyyy}-${mm}-${dd}`;
// Начало вчерашнего дня (ISO)
const start = new Date(yesterday);
start.setHours(0, 0, 0, 0);
const yesterdayStart = start.toISOString();
// Конец вчерашнего дня (ISO)
const end = new Date(yesterday);
end.setHours(23, 59, 59, 999);
const yesterdayEnd = end.toISOString();
// Возврат результата для следующих шагов Альбато
result = {
formattedDate,
yesterdayStart,
yesterdayEnd
};
Кейс 12. Разбор строки с именем и email
Задача: разбить строку вида Yana Kabritskaya <y.kabritskaya@albato.com> или y.kabritskaya@albato.com на два отдельных параметра — имя и email.
const emailMatch = str.match(/<\s*([^>]+)\s*>/) || str.match(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i);
email = emailMatch ? emailMatch[1] || emailMatch[0] : »;
// убираем email из строки → остаётся имя
name = str
.replace(/<[^>]*>/g, »)
.replace(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i, »)
.replace(/»/g, »)
.trim();
Код работает в обоих форматах: Yana Kabritskaya <y.kabritskaya@albato.com> и y.kabritskaya@albato.com. На выходе — два параметра: name и email.

Кейс 12. Извлечение нескольких метрик из одной строки
Если одно поле содержит сразу несколько показателей (например, строка вида 01.05.2024 шаги: 8000 ккал: 2200 белки: 150), этот код разбирает строку и раскладывает каждый показатель в отдельную переменную.
const result = {};
const dateMatch = str.match(/^\d{2}\/\d{2}\/\d{4}/);
if (dateMatch) {
result.date = dateMatch[0];
}
const rest = str.replace(result.date, »).trim();
const regex = /(\w+):\s([^:]+?)(?=\s\w+:|$)/g;
let match;
while ((match = regex.exec(rest)) !== null) {
const key = match[1];
const value = match[2].trim();
result[key] = value;
}
return result;
}const parsed = parseMetrics(input);
const date = parsed.date;
const pasos = parsed.pasos;
const kcal = parsed.kcal;
const prot = parsed.prot;
В «входных данных» укажите переменную input с исходной строкой. В «выходных данных» — каждую нужную переменную отдельно (date, pasos, kcal и т. д.) с типом String.
Если у вас возникнут вопросы по работе с инструментом, обратитесь в поддержку через чат на сайте.