Отправка сообщения в Telegram из Google Sheet через Google Scripts - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь отправлять себе телеграмму каждое утро с другой цитатой, которую я перечислил в Google Sheet. Я написал код, который добавляет сообщения в список, но я не могу сгенерировать случайную строку из списка для ежедневной отправки.

var token = "TOKEN"; 
var telegramAPI = "https://api.telegram.org/bot" + token; 
var webAppAPI = "https://script.google.com/macros/s/GOOGLE_WEB_APP_ADDRESS";
var ssId = "SPREADSHEET_ID"; 

function getMe() {
  var url = telegramAPI + "/getMe";
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

function setWebhook() {
  var url = telegramAPI + "/setWebhook?url=" + webAppAPI;
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

function sendText(id,text) {
  var url = telegramAPI + "/sendMessage?chat_id=" + id + "&text=" + text;
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

function doGet(e) {
  return HtmlService.createHtmlOutput("Test Data" + JSON.stringify(e,null,4));
}

function doPost(e) {
  Logger.log(e);  
  var data = JSON.parse(e.postData.contents);
  var text = data.message.text;
  var what = data.message.text.split("-")[0]
  var who = data.message.text.split("-")[1]
  var id = data.message.chat.id;
  var name = data.message.chat.first_name;
  var response = "Hi " + name + ", this quote has been added to your database: " + text;
  sendText(id,response);
  SpreadsheetApp.openById(ssId).getSheets()[1].appendRow([new Date(),id,name,text,response,what,who]);

Все это прекрасно работает. Я добавил запрос, который перетаскивает их в свой лист цитат с моего листа телеграмм, который я поставлю здесь, чтобы помочь кому-то:

=IFERROR(QUERY('Telegram Feed'!$G$1:$G$98,"",-1),"Error")

Теперь, когда я добавляю кавычки, я хочу создатьслучайный из списка и запланировать его отправку самому себе ежедневно. Я включил то, что я попробовал ниже, но я не могу понять, что я делаю неправильно.

Рандомизатор частично работает, но, кажется, захватывает весь контент, которыйМне нужно провести рефакторинг, чтобы сказать что-то вроде:

message = f"{quote} + ' - ' + {author}"

Рандомайзер:

function randomizer() {
  var ssa = SpreadsheetApp.openById(ssId);
  var ss = ssa.getSheetByName('Quotes'); 
  var range = ss.getRange(1,1,ss.getLastRow(), 2);
  var data = range.getValues();

  for(var i = 0; i < data.length; i++) 
  { 
    var j = Math.floor(Math.random()*(data[i].length));
    var element = data[i][j]; 
    ss.getRange(i+1, 6).setValue(element); 
    Logger.log(element);
  }
}  

До этого момента это в основном работало (хотя мне нужно выяснить, какисправьте функцию рандомизатора, как упомянуто выше. Когда я пытаюсь отправить случайное сообщение из скрипта в Telegram, у меня возникают проблемы.

function sendQuote(what,who) {
  var data = randomizer();
  var dataJSON = JSON.parse(data.postData.contents);
  var url = telegramAPI + "/sendMessage?chat_id=" + 'CHAT_ID_NUM' + "&text=" + what + " - " who;
} 

Я ничего не получаю. Кто-нибудь знает, что ячто-то не так?

РЕДАКТИРОВАТЬ:

Я последовал советам Дмитро-Булах и carlesgg97 и реорганизовал кучу своего рандомизированного кода, чтобы дать мне цитату и автора. По какой-то причине яТеперь я получаю сообщение об ошибке «Ошибка типа: не могу прочитать свойство« postData »из неопределенного: из строки, которая читает var dataJSON = JSON.parse(data.postData.contents);

Кто-нибудь знает, почему это происходит? Я закрою проблему в течение 24 часов RegaСпасибо всем за помощь!

function sendQuote(quote,author) {
  var data = randomize();
  var dataJSON = JSON.parse(data.postData.contents);
  var encodedText = encodeURIComponent(quote + " - " + author);
  var url = telegramAPI + "/sendMessage?chat_id=" + 'CHAT_ID' + "&text=" + encodedText;
  UrlFetchApp.fetch(url);
} 

function randomize() {
  var sss = SpreadsheetApp.openById(ssId);
  var ss = sss.getSheetByName('Quotes');

  var length = ss.getLastRow();
  var overshoot = 97 //monitor for changes as list size increases
  var true_length = length-overshoot;   
  var line = (Math.random() * ((true_length - 2) + 1)) + 2;

  var quote_cell = ss.getRange(line,2);
  var quote = quote_cell.getValue();
  var author_cell = ss.getRange(line,1);
  var author = author_cell.getValue();
  Logger.log(quote + " - " + author);
}

1 Ответ

1 голос
/ 21 октября 2019

Похоже, у вас могут быть две разные проблемы:

  1. Вы не кодируете текст как безопасный для URL. Чтобы безопасно добавить данные (в данном случае text строковый параметр URL-запроса) к вашему URL-адресу, вы должны использовать encodeURIComponent().
  2. Вы, похоже, на самом деле не отправляетезапрос. Вы пропустили вызов UrlFetchApp.fetch()?

Ниже приведен пример, который устраняет обе проблемы:

function sendQuote(what,who) {
  var data = randomizer();
  var dataJSON = JSON.parse(data.postData.contents);
  var encodedText = encodeURIComponent(what + " - " + who);
  var url = telegramAPI + "/sendMessage?chat_id=" + 'CHAT_ID_NUM' + "&text=" + encodedText;
  UrlFetchApp.fetch(url);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...