Как я могу сопоставить точный текст в определенном столбце и вывести всю строку информации? - PullRequest
1 голос
/ 10 января 2020

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

Поскольку я имею дело с номерами счетов-фактур и номерами отслеживания, иногда бот экспортирует неверную информацию, если текущий скрипт не соответствует точному тексту или указанному столбцу c.

Например, вместо того, чтобы искать и находить номер счета-фактуры, он выбирает частичное совпадение с номером отслеживания и выводит неверную информацию.

Я хотел бы настроить его для поиска указанного c столбец, ie. Столбец 3 - «Счет-фактура №», а затем выведите всю строку информации.

Заранее спасибо!

Я работаю в Google App Script:

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)
 }
  

Ответы [ 2 ]

1 голос
/ 10 января 2020

Вы хотите найти строки, в которых содержимое столбца 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 l oop перебирает все строки и сравнивает значения в столбце 3 (элемент массива [2] со значением текста
  • оператор == гарантирует, что будут найдены только точные совпадения (indexOf() также получит частичные совпадения)
  • Если совпадение найдено, значения из всей строки преобразуются в строку через запятую с помощью toString () (при желании вы можете получать значения по-разному)
  • Каждая строка с совпадением будет отправлена ​​в функцию sendText() (вы можете альтернативно выбрать pu sh все строки с совпадениями в массив / строку и вызовите sendText() только один раз, после выхода из for l oop

Я надеюсь, что этот ответ поможет вам решить вашу проблему и адаптировать предоставленный фрагмент кода к вашему потребность!

1 голос
/ 10 января 2020

Я бы искал указанный c столбец, в котором хранится номер заказа.

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

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.

}

Извините, я не проверял это, в настоящее время у меня нет времени, чтобы сделать тестовый лист, но я бы так сделал, и думаю, что это должно сработать.

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

...