Перенос скрипта из Google Apps Script: пример
Разберём перенос на типичном скрипте для таблицы заявок. Он делает две вещи:
- Когда в столбце «Статус» ставят «Готово», записывает в соседний столбец дату и время.
- Каждое утро присылает в Telegram и на почту число открытых заявок.
Лист «Заявки» устроен так: A — номер, B — клиент, C — тема, D — ответственный, E — статус, F — дата закрытия.
Общее сравнение и таблица соответствия команд — в статье Сравнение с Google Apps Script.
Исходный скрипт в Apps Script
const CHAT_ID = 123456789;
function onEdit(e) {
const sheet = e.range.getSheet();
if (sheet.getName() !== "Заявки" || e.range.getColumn() !== 5) return;
const row = e.range.getRow();
if (row === 1) return;
if (e.value === "Готово") {
sheet.getRange(row, 6).setValue(new Date());
}
}
function dailyReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const rows = ss.getSheetByName("Заявки").getDataRange().getValues();
const open = rows.slice(1).filter((row) => row[4] !== "Готово");
const text = "Открытых заявок: " + open.length;
const token = PropertiesService.getScriptProperties().getProperty("TG_TOKEN");
UrlFetchApp.fetch("https://api.telegram.org/bot" + token + "/sendMessage", {
method: "post",
contentType: "application/json",
payload: JSON.stringify({ chat_id: CHAT_ID, text: text }),
});
const date = Utilities.formatDate(new Date(), "Europe/Moscow", "dd.MM.yyyy");
MailApp.sendEmail("manager@example.com", "Заявки на " + date, text);
}
function createTriggers() {
ScriptApp.newTrigger("dailyReport").timeBased().everyDays(1).atHour(9).create();
}
Тот же скрипт в Coverse
const CHAT_ID = 123456789;
function onEdit(event) {
if (!event) return;
const done = event.changes.filter((change) => change.row > 1 && change.value === "Готово");
if (done.length === 0) return;
const sheet = Coverse.table.getSheet("Заявки");
for (const change of done) {
sheet.getRange(change.row, 6).setValue(new Date());
}
}
function dailyReport() {
const rows = Coverse.table.getSheet("Заявки").getDataRange().getValues();
const open = rows.slice(1).filter((row) => row[4] !== "Готово");
const text = "Открытых заявок: " + open.length;
Telegram.send(CHAT_ID, text);
const date = Utilities.formatDate(new Date(), "dd.MM.yyyy");
Mail.send("manager@example.com", "Заявки на " + date, text);
}
Функция createTriggers больше не нужна: триггеры настраиваются в редакторе.
Что изменилось и почему
Событие изменения
| Apps Script | Coverse | Зачем |
|---|---|---|
e.range.getSheet().getName(), e.range.getColumn() | проверку листа и столбца делает сам триггер | в настройках триггера указаны лист «Заявки» и диапазон E:E, правки в других местах скрипт не запускают |
e.range.getRow(), e.value | event.changes: row, value для каждой ячейки | в Coverse приходят все изменённые ячейки. Если вставить статус «Готово» сразу в десять строк, дата появится во всех десяти |
if (!event) return; | добавлено | при ручном запуске кнопкой «Запустить» события нет, функция просто выйдет |
Если не ограничивать триггер диапазоном, добавьте проверку в код: change.sheet === "Заявки" && change.column === 5.
Запись даты в столбец F не вызывает onEdit повторно: изменения, которые делают скрипты, триггер не запускают.
Таблица и лист
| Apps Script | Coverse |
|---|---|
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Заявки") | Coverse.table.getSheet("Заявки") |
getDataRange().getValues(), getRange(row, 6).setValue(...) | без изменений |
getSheet останавливает скрипт понятной ошибкой, если листа нет. getSheetByName вернёт null, как в Apps Script.
Telegram
| Apps Script | Coverse |
|---|---|
токен в свойствах скрипта, UrlFetchApp.fetch к api.telegram.org с ручной сборкой JSON | Telegram.send(CHAT_ID, text) |
Токен бота сохраните на вкладке «Секреты» под именем TELEGRAM_BOT_TOKEN: Telegram.send берёт его сам. В журнале запусков значение токена заменяется на ***. См. Секреты.
Почта и дата
| Apps Script | Coverse |
|---|---|
MailApp.sendEmail(to, subject, body) | Mail.send(to, subject, body) |
Utilities.formatDate(date, "Europe/Moscow", "dd.MM.yyyy") | Utilities.formatDate(date, "dd.MM.yyyy") |
В Coverse шаблон даты идёт вторым параметром, а часовой пояс третьим и необязательным: по умолчанию берётся часовой пояс владельца скрипта. Письмо уходит с пометкой «через Coverse», за сутки можно написать 10 адресатам. См. Внешние сервисы.
Настроить триггеры
- Откройте вкладку «Триггеры» и нажмите «Добавить триггер».
- Выберите «При изменении», функцию
onEdit, лист «Заявки» и диапазонE:E. - Добавьте второй триггер: «По расписанию», раз в день в 9:00, функция
dailyReport. Время считается по часовому поясу из вашего профиля.
Подробнее: Триггеры.
Проверить
- Выберите в меню рядом с кнопкой «Запустить» функцию
dailyReportи запустите её: в Telegram и на почту должен прийти отчёт. - Для
onEditвыберите «Запустить с событием» и тестовое событие, либо поставьте «Готово» в любую строку листа и через несколько секунд проверьте столбец F. - Посмотрите вкладку «Журнал»: там видны статус, длительность и вывод
console.logкаждого запуска.
Перенести с помощью ИИ
Тот же перенос можно поручить ИИ в редакторе: нажмите «ИИ», напишите «Перепиши этот скрипт Google Apps Script для Coverse» и вставьте исходный код. ИИ заменит команды и предложит нужный запуск по расписанию. Проверьте изменения перед тем, как принять. См. Скрипт с помощью ИИ.