我一直在尝试创建一个Telegram机器人,该机器人可以搜索现有数据库并根据搜索查询输出信息,从本质上讲,我希望该机器人仅通过Telegram接收包含发票编号的文本,并输出有关该订单的所有相关信息(整行信息)。
由于我处理的是发票号和跟踪号,鉴于当前脚本与确切的文本或特定的列不匹配,有时机器人会导出不正确的信息。
例如,与其搜索和查找发票号,不如选择跟踪号的部分匹配并输出错误的信息。
我想将其设置为搜索特定的列,即第3列-“发票编号”,然后输出整行信息。
提前感谢!
我一直在使用Google App脚本:
var token = "";
var telegramUrl = "https://api.telegram.org/bot" + token;
var webAppUrl = "";
var ssId = "";
function getMe() {
var url = telegramUrl + "/getMe";
var response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
function setWebhook() {
var url = telegramUrl + "/setWebhook?url=" + webAppUrl;
var response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
function sendText(id,text) {
var url = telegramUrl + "/sendMessage?chat_id=" + id + "&text=" + text;
var response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
function doGet(e) {
return HtmlService.createHtmlOutput("Hi there");
}
function doPost(e) {
var data = JSON.parse(e.postData.contents);
var text = data.message.text;
var id = data.message.chat.id;
var name = data.message.chat.first_name + " " + data.message.chat.last_name;
var answer = "Hi " + name + ", please enter invoice number.";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Orders");
var search_string = text
var textFinder = sheet.createTextFinder(search_string)
var search_row = textFinder.findNext().getRow();
var value = SpreadsheetApp.getActiveSheet().getRange("F"+search_row).getValues();
var value_a = SpreadsheetApp.getActiveSheet().getRange("G"+search_row).getValues();
sendText(id,value+" "+ value_a)
}
我会在其中存储订单号的特定列。
我不确定从性能角度来看这是否是最好的方法,但我认为它应该有效。
function orderInformation(orderNumber){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Orders");
//Gets last row in Orders sheet
var lastRow = sheet.getLastRow();
//Here you can change column where is order number stored
var orderNumberRange = sheet.getRange("A1:A" + lastRow);
//Gets all order number values
var orderNumbers = orderNumberRange.getValues();
//You can use indexOf to find which row has information about requested order
var orderLocation = orderNumbers.indexOf(orderNumber);
//Now get row with order data, lets suppose that your order information is from column A to Z
var orderData = sheet.getRange("A" + (orderLocation + 1) + ":Z" + (orderLocation + 1)).getValues();
//Now you have all data in array, where you can loop through and generate response text for a customer.
}
[抱歉,我还没有测试它,目前我没有时间来做一张测试纸,但这是我要做的方法,我认为它应该可以工作。
我可能会稍后再进行测试时进行测试。
如下修改功能doPost
:
function doPost(e) {
var data = JSON.parse(e.postData.contents);
var text = data.message.text;
var id = data.message.chat.id;
var name = data.message.chat.first_name + " " + data.message.chat.last_name;
var answer = "Hi " + name + ", please enter invoice number.";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Orders");
var range = sheet.getRange(1,1, sheet.getLastRow(), sheet.getLastColumn());
var values = range.getValues();
for (var i=0; i< values.length; i++){
var column3Value = values[i][2];
if(column3Value == text){
var rowValues = values[i].toString();
sendText(id,rowValues)
}
}
}
说明
for
循环遍历所有行并比较第3列中的值(数组element [2]与文本值进行比较==
确保仅找到完全匹配的内容(indexOf()
还将检索部分匹配的内容]sendText()
(您可以选择将具有匹配项的所有行压入数组/字符串,并在退出sendText()
循环后仅调用一次for
)>我希望这个答案可以帮助您解决问题,并使提供的代码段适合您的需求!