我每天早晨都在尝试向自己发送电报消息,并使用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]);
所有这些都很好。我添加了一个查询,将其从“电报摘要”工作表中拉到“报价”工作表,我将在此处帮助他人:
=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发送随机消息时遇到问题。< / p>
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的建议,并且重构了我的一些随机代码,为我提供了报价和作者。由于某种原因,我现在从读取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);
}
答案 0 :(得分:1)
似乎您可能遇到两个不同的问题:
text
URL查询字符串参数)安全地附加到URL,您应该使用encodeURIComponent()
。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);
}