@Bigma Да, понимаю, раньше это получалось, в этот раз просто затупил больше обычного.
И спасибо
Как отслеживать, что скрипт работает и не "упал" ?
-
Для начала нужен гугл аккаунт, авторизируемся, переходим в гугл таблицы https://docs.google.com/spreadsheets и создаём новую таблицу

Далее заходим в меню "расширения" -> "Apps script"

В нём пишем функцию заполнения данных из скрипта BAS через get-запрос. Отправлять мы будем номер строки для записи данных и сами данные:
function doGet(e) { var rowNumber = e.parameter.rowNumber; var data = e.parameter.data; var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange(rowNumber, 1).setValue(new Date().getTime()); sheet.getRange(rowNumber, 2).setValue(data); return ContentService.createTextOutput("Your advertisement could be here :)"); }
Благодаря этому скрипту данные будут заполнятся в таблице в таком виде:

Что бы проверить, что всё работает как надо, нужно сохранить скрипт

Затем нужно развернуть приложение "Начать развёртывание" -> "Новое развёртывание":

В описании укажите хотя бы цирфу, что бы потом не запутаться. В поле "запуск от имени" нужно указать "От моего имени" что бы данные в таблицу можно было добавлять без авторизации в гугле через get-запросы из BAS. В поле "У кого есть доступ" указать нужно "Все" тоже для того, что бы не авторизовываться в гугле при добавлении данных в таблицу

Затем нужно нажать "Начать развёртывание" и в появившемся окне скопировать ссылку на веб-приложение и нажать кнопку "Готово"

Сохранённая ссылка будет подобного вида:
https://script.google.com/macros/s/AKfyмногобукавOia06eA/exec
Пробуем передать данные. Для этого к ссылке нужно добавить параметры "rowNumber" и "data"
https://script.google.com/macros/s/AKfyмногобукавOia06eA/exec?rowNumber=1&data=potok_1
Заходим в BAS и создаём get-запрос с этой ссылкой. После выполнения проверяем добавились ли данные в таблицу:

Убедившись, что всё хорошо продолжаем работу. Теперь нам нужно создать функцию отправки сообщения в телеграмм. Для этого нужно создать бота телеграмм и получить id чата. Расписывать подробно не буду, проще прочитать здесь https://habr.com/ru/articles/306222/
Добавляем в наш скрипт в "Apps script" функцию отправки:
function sendTelegramMessage(messageText) { var telegramToken = "BOT_TOKEN"; var chatId = "CHAT_ID"; var url = "https://api.telegram.org/bot" + telegramToken + "/sendMessage?chat_id=" + chatId + "&text=" + encodeURIComponent(messageText); var response = UrlFetchApp.fetch(url); }
Для проверки добавляем чуть ниже вызов функции:
sendTelegramMessage("hello")выбираем функцию "sendTelegramMessage" и нажимаем кнопку "Выполнить". В итоге вам в тг от бота должно придти сообщение "hello".
Если всё хорошо, удаляем из кода строку
sendTelegramMessage("hello")и приступаем к написанию функции проверки данных.function checkForData() { var minutesCheck = 5 //количество минут прошедших с последнего обновления данных, для регистрации проблемы var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var dataRange = sheet.getDataRange(); var data = dataRange.getValues(); var currentTime = new Date().getTime(); var resultArray = []; for (var i = 0; i < data.length; i++) { var timestamp = data[i][0]; var timeDifference = (currentTime - timestamp) / (1000 * 60); if (timeDifference > minutesCheck) { resultArray.push(data[i][1]); } } if(resultArray.length > 0) { sendTelegramMessage("Проблема с потоками:\n" + resultArray.join('\n')) } }Функция проверяет столбец "A" с записанным временем и сверяет, прошло ли с того времени 5 минут, если прошло, то функция берёт данные с этой строки из столбца "B" и отправляет в тг
Для проверки выбираем функцию "checkForData" и жмём кнопку "Выполнить". В итоге вам в тг от бота должно придти сообщение

Если всё хорошо, можно приступить к установке тригера по времени. Для этого нужно нажать на значок с часами на левой панели "Apps scripts"

Справа внизу будет кнопка "Добавить триггер"

Функцию нужно выбрать "checkForData". Развёртывание лучше указать "Основное развёртывание". Тип триггера указать "по минутам" и промежуток указать "раз в минуту" (ну или по больше, если не так важно)

Нажимаем кнопку "Сохранить" и в списке триггеров должен появится только что созданный триггер:

В конце нужно сделать снова новое развёртывание и получить ссылку. Разворачивать кстати придётся при каждом изменении скрипта в будущем.
Приступаем к проверке работы всей системы. Создаём скрипт BAS на 10 потоков, в которых каждый поток узнаёт свой номер и отправляет его в качестве номера строки в таблице и данных. Для корректной передачи данных для параметра "data" нужно использовать действие "Url компонент кодировать/декодировать", а номер потока можно передавать просто цифрой:

Данные в таблице будут в таком виде:

Всё. Если остановить скрипт, то через минуту придёт сообщение в тг:

Сообщение об ошибках будет приходить в тг каждую минуту, потому что в настройках триггера было установлено частота выполнения "раз в минуту"
-
Я показал только самые основы, можно как угодно изменять, улучшать и усложнять скрипты на любых этапах (передавать данные в json, добавлять стили, цвета, кнопки управления в таблицу или тг чат и т.д.)
-
@Fox said in Как отслеживать, что скрипт работает и не "упал" ?:
Я показал только самые основы, можно как угодно изменять, улучшать и усложнять скрипты на любых этапах (передавать данные в json, добавлять стили, цвета, кнопки управления в таблицу или тг чат и т.д.)
Охренеть крутотень!
Но вот теперь задумался, не проще ли на своем сайте сделать страницу, куда поток будет вносить в куки значение "1" если работает, на пол часа.
Как только 30 минут значение не заносится, оно обнуляется. Время от времени я просто буду в телефоне обновлять страничку... Вижу "0" - упал софт.зs мне прям онлайн видеть что софт упал не нужно... Просто задача избежать того что он лежит часами напролет.
-
@kuzkuz said in Как отслеживать, что скрипт работает и не "упал" ?:
@Fox said in Как отслеживать, что скрипт работает и не "упал" ?:
Я показал только самые основы, можно как угодно изменять, улучшать и усложнять скрипты на любых этапах (передавать данные в json, добавлять стили, цвета, кнопки управления в таблицу или тг чат и т.д.)
Охренеть крутотень!
Но вот теперь задумался, не проще ли на своем сайте сделать страницу, куда поток будет вносить в куки значение "1" если работает, на пол часа.
Как только 30 минут значение не заносится, оно обнуляется. Время от времени я просто буду в телефоне обновлять страничку... Вижу "0" - упал софт.зs мне прям онлайн видеть что софт упал не нужно... Просто задача избежать того что он лежит часами напролет.
Если есть свой сервер, это в разы будет проще. Поднимите веб сервер на сервере, расшартье внешний ip для получения данных из скрипта BAS (отправлять http-запросы можно прямо на ip сервера). А внутри уже реализуйте какую угодно логику проверки и уведомления (тг, ватсап, вк, почта).
Либо поднимите удалённую базу и формируйте данные в ней, вместо веба. Вариантов тьма, отталкиваться нужно от доступных инструментов. -
@mnail84 said in Как отслеживать, что скрипт работает и не "упал" ?:
@Fox пост, достойный быть в вики :)
Спасибо. Гугл таблицы достаточно мощный, не очень сложный, универсальный и бесплатный инструмент, по этому он мне и понравился.
Но выше правильная мысль прозвучала - очень не хватает функции онАппликейшнЭнд как минимум. А так же onThreadEnd. Сразу сообщение в телегу бы прилетало. Комп и интернет можно и так остлеживать.
Функции "онАппликейшнЭнд" и "onThreadEnd" находятся в списке желаемого (отдельное репо, где я собираю предложения пользователей по развитию BAS). Сейчас же "онАппликейшнЭнд" можно реализовать через действие "Вызов функции в несколько потоков", а "onThreadEnd" через игнорирование ошибок вызова функции.
-
@Fox said in Как отслеживать, что скрипт работает и не "упал" ?:
Сейчас же "онАппликейшнЭнд" можно реализовать через действие "Вызов функции в несколько потоков",
то есть по сути не пользоваться потоками баса, а самому их сделать через это действие, я правильно понял?
В общем, пока костылями подпереть и ждать функционала :)
-
@mnail84 said in Как отслеживать, что скрипт работает и не "упал" ?:
Сейчас же "онАппликейшнЭнд" можно реализовать через действие "Вызов функции в несколько потоков",
то есть по сути не пользоваться потоками баса, а самому их сделать через это действие, я правильно понял?
В общем, пока костылями подпереть и ждать функционала :)
Обсуждали много раз, называть можно как хочешь, смысл в том, что бы все действия из функции Main переместить в любую другую, которую вызывать через действие "Вызов функции в несколько потоков". BAS вызывать в один поток, а количество потоков установить в действие. В итоге действия помещённые перед действием "Вызов функции в несколько потоков" будут выполнятся перед началом работы, а действия после "Вызов функции в несколько потоков" будут выполняться соотвественно после работы (читай "OnApplicationStart" и "OnApplicationEnd")
-
This post is deleted!