@Mosapi

Как избежать дублей сообщений при отправке сообщений через Телеграм бота?

Есть простейшая связка GAS + Telegram которая осуществляет простые уведомления в группу, когда определенный столбец и определенное кол-во строк заполняются "1".
таблица состоит из секций подобного вида:
66e01c17e9fb2301417611.jpeg
Все работает, и уведомления прекрасно отправляются.
Но в ходе работы замечен неприятный баг. Когда пользователь заполняет столбец единицами, производя переход между строками с помощью "стрелки вниз". Заполнив последнюю строку и быстро нажав вниз один или несколько раз. В телеграм отправляется от двух, до нескольких(к примеру на представленном изображении 7 строк параметров, т.е. кол-во сообщений может варьироваться от 1-2 до 7) сообщений с одним и тем же текстом. Я понимаю, что проблема, где-то в коде отправки, возможно не хватает какой-нибудь проверки, но не понимаю, как этого можно избежать?

Функция триггер:
function onEdit(e){
var row = e.range.getRow();//получаем строку события
var col = e.range.getColumn();//получаем колонку события
var val = Number(e.range.getValues());//получаем число ввода
var shifr = SS.getRange(2, col-1).getValue();
	if(val == 1){
	var listName = SS.getName();//получаем название листа		
	var preSum = SS.getRange(3, col).getValue();//получаем число суммы
	var delta = Number(preSum) / Number(shifr);//расчитываем дельту
	if(delta == 1){
	  var setParametr = SS.getRange(3,col-1).getValue();
	  var sendText = setParametr + " ( "+listName+" ). Параметр активен\n ";
	  sendMessage(chatId,sendText);
	}
	}
}


Отправка сообщения:
function sendMessage(chatId, sendText){
  let payload = {
      method: 'sendMessage',
      chat_id: String(chatId),
      text: sendText,
      parse_mode: 'HTML'
  },
  
  data = {
    method: 'post',
    payload: payload    
  };
  
  UrlFetchApp.fetch(telegramUrl + '/', data);
}


Функция веб-хука:
function setWebhook(){
  var url = telegramUrl + "/setWebhook?url=" + webAppUrl + "&drop_pending_updates=true";
  //https://api.telegram.org/bot<bot_token>/setWebhook?url=<webhook_url>&drop_pending_updates=true
  var response = UrlFetchApp.fetch(url);
}
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 1
ProgrammerForever
@ProgrammerForever Куратор тега Google Apps Script
Учитель, автоэлектрик, программист, музыкант
Обычно проблема что onEdit не каждый раз срабатывает и события пропускаются, а тут наоборот.
По факту каждое редактирование генерирует onEdit событие. Если надо отправлять реже - определитесь по какому параметру фильтровать эти события - по данным, по времени или еще как-то.
1) Сделать очередь на отправку, отправлять пачкой по достижении какого-то количества
2) Или запускать раз в минуту отправку
3) Или блокировать документ на время отправки, если возникает гонка
Или любая другая логика, сейчас непонятна проблема.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы