如何匹配特定列中的精确文本并输出整行信息?

How can I match exact text in a particular column and output the entire row of information?

我一直在尝试创建一个 Telegram 机器人来搜索预先存在的数据库并根据搜索查询输出信息,基本上我希望机器人通过 Telegram 接收包含发票号码的文本并输出所有相关信息该顺序(整行信息)。

由于我处理的是发票号和跟踪号,有时机器人会导出不正确的信息,因为当前脚本与确切文本或特定列不匹配。

例如,它没有搜索和查找发票号,而是选择了部分匹配的跟踪号并输出了错误的信息。

我想将其设置为搜索特定列,即。第3列-"Invoice #"然后输出整行信息。

提前致谢!

我一直在 Google 应用程序脚本中工作:

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.

}

抱歉,我还没有测试过,目前我没有时间进行测试sheet,但这是我会做的,我认为它应该可以工作。

我可能会在稍后可以进行测试时进行测试sheet。

您想查找第 3 列中的内容正好等于您的变量的行 "text"

修改函数 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 列中的值(数组元素 [2] 与文本
  • 的值
  • 运算符 == 确保只找到完全匹配(indexOf() 也会检索部分匹配)
  • 如果找到匹配项,整行的值将转换为逗号分隔的字符串 toString()(如果需要,您可以对值进行不同的处理)
  • 匹配的每一行都将发送到函数 sendText()(您也可以将所有匹配的行推送到数组/字符串中,并在退出 for循环

我希望这个答案能帮助您解决问题并根据您的需要调整提供的代码片段!