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

Перенос скрипта из Google Apps Script: пример

Разберём перенос на типичном скрипте для таблицы заявок. Он делает две вещи:

  1. Когда в столбце «Статус» ставят «Готово», записывает в соседний столбец дату и время.
  2. Каждое утро присылает в 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 ScriptCoverseЗачем
e.range.getSheet().getName(), e.range.getColumn()проверку листа и столбца делает сам триггерв настройках триггера указаны лист «Заявки» и диапазон E:E, правки в других местах скрипт не запускают
e.range.getRow(), e.valueevent.changes: row, value для каждой ячейкив Coverse приходят все изменённые ячейки. Если вставить статус «Готово» сразу в десять строк, дата появится во всех десяти
if (!event) return;добавленопри ручном запуске кнопкой «Запустить» события нет, функция просто выйдет

Если не ограничивать триггер диапазоном, добавьте проверку в код: change.sheet === "Заявки" && change.column === 5.

Запись даты в столбец F не вызывает onEdit повторно: изменения, которые делают скрипты, триггер не запускают.

Таблица и лист​

Apps ScriptCoverse
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Заявки")Coverse.table.getSheet("Заявки")
getDataRange().getValues(), getRange(row, 6).setValue(...)без изменений

getSheet останавливает скрипт понятной ошибкой, если листа нет. getSheetByName вернёт null, как в Apps Script.

Telegram​

Apps ScriptCoverse
токен в свойствах скрипта, UrlFetchApp.fetch к api.telegram.org с ручной сборкой JSONTelegram.send(CHAT_ID, text)

Токен бота сохраните на вкладке «Секреты» под именем TELEGRAM_BOT_TOKEN: Telegram.send берёт его сам. В журнале запусков значение токена заменяется на ***. См. Секреты.

Почта и дата​

Apps ScriptCoverse
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 адресатам. См. Внешние сервисы.

Настроить триггеры​

  1. Откройте вкладку «Триггеры» и нажмите «Добавить триггер».
  2. Выберите «При изменении», функцию onEdit, лист «Заявки» и диапазон E:E.
  3. Добавьте второй триггер: «По расписанию», раз в день в 9:00, функция dailyReport. Время считается по часовому поясу из вашего профиля.

Подробнее: Триггеры.

Проверить​

  1. Выберите в меню рядом с кнопкой «Запустить» функцию dailyReport и запустите её: в Telegram и на почту должен прийти отчёт.
  2. Для onEdit выберите «Запустить с событием» и тестовое событие, либо поставьте «Готово» в любую строку листа и через несколько секунд проверьте столбец F.
  3. Посмотрите вкладку «Журнал»: там видны статус, длительность и вывод console.log каждого запуска.

Перенести с помощью ИИ​

Тот же перенос можно поручить ИИ в редакторе: нажмите «ИИ», напишите «Перепиши этот скрипт Google Apps Script для Coverse» и вставьте исходный код. ИИ заменит команды и предложит нужный запуск по расписанию. Проверьте изменения перед тем, как принять. См. Скрипт с помощью ИИ.

Что дальше​