javascript - 通过 Google Scripts 从 Google Sheet 向 Telegram 发送消息

标签 javascript json google-apps-script google-sheets-api telegram-bot

我正在尝试每天早上向自己发送电报消息,其中包含我在 Google 表格中列出的不同引述。我写了一些代码将消息添加到列表中,但我似乎无法从列表中生成随机行以每天发送。

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]);

一切正常。我添加了一个查询,将它们从我的 Telegram Feed 表中拉到我的报价表中,我将把它放在这里以帮助某人:

=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 的建议,重构了一堆随机化代码以提供引述和作者。出于某种原因,我现在收到错误“TypeError: Cannot read property 'postData' from undefined.: from the line that reads var dataJSON = JSON.parse(data.postData.contents);

有人知道为什么会这样吗? 无论如何,我都会在 24 小时内关闭问题。感谢大家的帮助!

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. 您没有将文本编码为 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);
} 

关于javascript - 通过 Google Scripts 从 Google Sheet 向 Telegram 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58479710/

相关文章:

javascript - 创建 javascript/html 表单计算器 - 简单的方法吗?

javascript - json_encode 仅适用于某些 php 数组,不导入其他数组的数据

python - 在 python 中更新 Json 值

json - 使用 circe-optics 从 json 中检索空值

caching - GSCRIPT - 如何缓存 HTML 页面内容?

javascript - {} 和 () 与 .map 与 Reactjs 的区别

javascript - Bootstrap 确认: Detect open and close states?

javascript - Typeahead 0.11.1 查看下拉搜索结果时鼠标悬停和键盘冲突

google-apps-script - getRange 使用脚本命名范围谷歌电子表格

javascript - 使用脚本应用程序从 Google Sheet 中的单元格中提取日期