JavaScript, HTML, CSS e... !
25 commenti

Risponde in Modo Automatico agli Utenti

Bot di Telegram che Sceglie i Messaggi da un Foglio Google

Abbiamo visto in altri miei video come bastano 5 minuti per creare un semplice Bot di Telegram, come inviare immagini in automatico da parte del Bot e come salvare in un Foglio Google i messaggi che gli utenti scrivono nella chat.

In questo video voglio mostrarti come istruire il Bot in modo da rispondere in modo dinamico ai messaggi dell'utente, per farlo il Bot analizzerà il testo del messaggio ricevuto e cercherà in un Foglio Google la risposta appropriata da fornire.

Ho predisposto in uno Spreadsheet una lista di cocktail con i relativi ingredienti e le istruzioni per prepararli, ovviamente si tratta di un esempio e l’elenco non è esaustivo.

Lo scopo di questo bot è quello di ricevere in ingresso il nome di un drink e fornire all’utente le opportune informazioni per poterlo preparare.

Il nome del foglio dove ho inserito tali dati è 'Foglio2', il 'Foglio1' invece è attualmente vuoto e lo utilizzerò per salvare i messaggi che gli utenti scrivono nella chat, può essere molto utile ad esempio per verificare quale cocktail è più richiesto rispetto ad altri o per verificare se gli utenti richiedono qualcosa che non ho previsto e nel caso integrare la lista.

Spero che questo video ti sia piaciuto, nel prossimo tutorial sull'argomento ti mostrerò come ottenere queste informazioni in modo dinamico interrogando direttamente un servizio esterno, senza bisogno di scriverle in uno Spreadsheet. Ti invito pertanto a iscriverti al mio Canale YouTube se ancora non l'hai fatto e a lasciarmi un commento se hai un dubbio, un suggerimento o un argomento che ritieni interessante e che vorresti fosse trattato in tutorial.

Di seguito il codice mostrato nel video:

var token = getTokenId(); // ho nascosto il valore del token nel file token_id.gs per non mostrarlo a video
var telegramUrl = "https://api.telegram.org/bot" + token; 
var webAppUrl = "https://script.google.com/macros/s/TUO_ID_APPLICAZIONE/exec"; 

function setWebhook() {
  var url = telegramUrl + "/setWebhook?url=" + webAppUrl;
  var response = UrlFetchApp.fetch(url);
}

function sendMessage(chat_id, text) {
  var url = telegramUrl + "/sendMessage?chat_id=" + chat_id + "&text="+ text;
  var response = UrlFetchApp.fetch(url);
}

function doPost(e) {
  var contents = JSON.parse(e.postData.contents);
  var chat_id = contents.message.from.id; 
  var user = contents.message.chat.first_name + " " + contents.message.chat.last_name;
  var answer = "Ciao " + user + ". Scrivi il nome di un cocktail e ti dirò come prepararlo!";
  var text = contents.message.text;

  var ssId = "SPREADSHEET_ID";
  var sh2 = SpreadsheetApp.openById(ssId).getSheetByName("Foglio2");
  var sh2range = sh2.getRange(1, 1, sh2.getLastRow(), sh2.getLastColumn());
  var sh2values = sh2range.getValues();
  var sh2values_len = sh2values.length;
  var cocktail_nome;
  for (i=0; i<sh2values_len; i++) {
    cocktail_nome = sh2values[i][0]+'';
    if (text.toLowerCase() == cocktail_nome.toLowerCase()) {
      answer = "Ingredienti: " + sh2values[i][1] + '.' + '%0A' + "Preparazione: " + sh2values[i][2];
      break;
    }
  }

  sendMessage(chat_id, answer);
  SpreadsheetApp.openById(ssId).getSheetByName("Foglio1").appendRow([new Date(), chat_id, user, text]);
}

Per il momento ti saluto e a presto, ciao ;)

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

25 Commenti

  1. Thursday, August 5, 2021 alle ore 12:10 Franco

    Ho notato che se in una cella ho un testo su piu' linee (separato da ctrl+enter) la funzione che dovrebbe mostrare su telegram il contenuto della cella stessa, non funziona.. Come posso risolvere ?
    Grazie

    Rispondi a questo commento
    • Saturday, August 7, 2021 alle ore 09:50 Michele PisaniAutore

      Ciao Franco,
      in questo caso proverei a processare la stringa in ingresso con il metodo replace per sostituire il carattere a capo con uno spazio e vedere se il problema si risolve.

      Rispondi a questo commento
  2. Friday, May 6, 2022 alle ore 10:49 Isac

    Ciao Michele, i tuoi tutorial sono fantastici!!! grazie.
    Mi piacerebbe realizzare, un bot telegram che scova le offerte sul sito di Amazon, e poi le pubblichi in automatico ogni 10 minuti, all'egando al link l'ID di affiIiazione Amazon, il tutto in Canale telegram.
    Riusciresti a fare un tutorial il merito?
    Ringrazio per l'attenzione

    Rispondi a questo commento
    • Friday, May 6, 2022 alle ore 21:28 Michele PisaniAutore

      Ciao Isac,
      grazie dei complimenti! :)
      Quello che chiedi è un progetto vero e proprio di una certa complessità e che richiede particolari specifiche. Sicuramente tra i video tutorial e i post nel blog puoi riuscire a trovare qualche spunto interessante per adattare i relativi concetti e parti di codice da integrare al progetto che vuoi realizzare.

      Rispondi a questo commento
  3. Tuesday, July 12, 2022 alle ore 09:37 Andrea

    Buongiorno Michele,

    grazie di cuore per questa guida. Ho utilizzato il tuo script apportando un paio di modifiche in modo che il bot possa rispondere a un messaggio da un gruppo.
    Per la variabile chat_id: var chat_id = contents.message.chat.id; ho modificato da "from" a "chat".
    Mi ritrovo però con un problema. Se interrogo il bot in privato, il sistema funziona perfettamente, mentre se provo a chiamarlo da un gruppo telegram (per esempio: /nomebot testo), viene preso la riga intera e quindi mi restituisce un errore non trovando nulla in google sheet. Come posso fare in quel caso a dire al bot di prendere solo il testo (senza la chiamata "/nomebot")?

    Grazie mille,
    Andrea

    Rispondi a questo commento
    • Tuesday, July 12, 2022 alle ore 12:19 Michele Pisani

      Ciao Andrea,
      non conosco la riga nella sua interezza, ad ogni modo se c'è una parte fissa da eliminare, come ad esempio "/nomebot", puoi giocare con i metodi per le stringhe, ad esempio con replace per sostituire il testo di interesse con un valore vuoto.

      Rispondi a questo commento
  4. Tuesday, August 23, 2022 alle ore 11:17 Gianluca Carriere

    Grazie mille per i tutorial. Ho seguito passo passo le preziose indicazioni ma non riesco ad avviare il tutto perchè visualizzo il seguente messaggio di Errore

    TypeError: Cannot read property 'postData' of undefined
    doPost @ Codice.gs:16

    come risolverlo?
    grazie mille

    Rispondi a questo commento
    • Tuesday, August 23, 2022 alle ore 19:36 Michele PisaniAutore

      Ciao Gianluca, dall'errore sembra che tu stia eseguendo la funzione a mano dall'editor di script. La funzione doPost(e) deve essere invocata dal Bot, altrimenti la variabile 'e' non contiene dati che risulteranno, appunto, undefined.

      Rispondi a questo commento
      • Sunday, November 20, 2022 alle ore 18:13 pietro

        ciao proprio oggi sta capitando anche a me ...fino a ieri eseguivo la funzione da script senza errore..... non mi pare di aver fatto qualcosa di diverso ma ora non mi va e non mi salva le modifiche
        faccio altre prove

  5. Friday, November 11, 2022 alle ore 07:17 Pietro

    Ciao fantastico questo tutorial ..volevo domandare una cosa nella ricerca del testo
    if (text.toLowerCase() == cocktail_nome.toLowerCase())
    Invece di cercare un testo uguale tipo è possibile cercare un testo che contenga più cose anche in ordine diverso nella stessa cella?

    Rispondi a questo commento
    • Friday, November 11, 2022 alle ore 12:50 Michele PisaniAutore

      Ciao Pietro,
      grazie del feedback!
      Per rispondere alla tua domanda, certo, puoi provare con le espressioni regolari, dette anche Regex :)

      Rispondi a questo commento
  6. Tuesday, November 15, 2022 alle ore 19:51 Pietro

    Ciao torno a domandare un altra cosa...
    Se volessi che fossero inviati più coktail?
    Nel caso ce ne fossero 2 con nomi simili ad esempio per visualizzarli entrambi su telegram intendo...ancora grazie per il tuo lavoro

    Rispondi a questo commento
    • Tuesday, November 15, 2022 alle ore 22:47 Michele PisaniAutore

      Ciao Pietro,
      in quel caso anziché effettuare il controllo con l'uguaglianza potresti utilizzare un'espressione regolare :)

      Rispondi a questo commento
      • Wednesday, November 16, 2022 alle ore 07:10 Pietro

        Ora sto usando match e trovo le parole che voglio ma mi fa vedere sempre una sola riga....faccio altri tentativi...grazie

  7. Saturday, January 6, 2024 alle ore 14:07 giorgio

    non ho capito come faccio a far eseguire il comando

    Rispondi a questo commento
  8. Saturday, January 6, 2024 alle ore 14:30 piergiorgio

    non capisco come faccio a far funzionare il tutto,

    Rispondi a questo commento
    • Saturday, January 6, 2024 alle ore 14:35 Michele PisaniAutore

      Lo spiego nel video. Nel mio canale puoi trovare anche altri video sul tema.

      Rispondi a questo commento
      • Saturday, January 6, 2024 alle ore 14:36 piergiorgio

        ho il mio bot come faccio far eseguire il comando apps scripts come nell'esempio

      • Saturday, January 6, 2024 alle ore 14:40 Michele PisaniAutore

        Non capisco ancora a quale comando ti riferisci. Se intendi in generale l'attivazione della funzione del bot, di attiva automaticamente appena viene inviato un messaggio su Telegram. Non si attiva a mano da Apps Script. Se con il messaggio non funziona significa che c'è un errore, nel bot o nel codice.

  9. Monday, January 29, 2024 alle ore 20:30 Francesco

    Ciao Michele, come posso ottenere più di una risposta se nel foglio di google ho due cocktail simili?
    Mi spiego meglio:
    Google Sheets:
    Spritz Aperol
    Spritz Campari

    Vorrei inserire nel box di telegram "Spritz" e riceve come risposta entrambe le ricette, è possibile?

    Rispondi a questo commento
    • Tuesday, January 30, 2024 alle ore 16:03 Michele PisaniAutore

      Ciao Francesco, in tal caso dovresti cercare il termine "Spritz" nel primo campo (non con la corrispondenza esatta ma esempio con "indexOf") all'interno del ciclo e ogni volta che viene trovata una corrispondenza concatenare il risultato nella variabile di output. Per questo motivo dovrà essere rimossa l'istruzione "break".

      Rispondi a questo commento
  10. Monday, February 26, 2024 alle ore 20:57 Raffaele Devita

    Ciao, prima di tutto i complimenti, ho seguito tutte le tue istruzioni e il bot ha funzionato bene per più di un mese, oggi all'improvviso ha smesso di funzionare, non so cosa sia successo, lo script è all'interno di un file excel, ma davvero non capisco e non so come risolverlo.

    Grazie del tuo aiuto.

    Rispondi a questo commento
    • Monday, February 26, 2024 alle ore 21:28 Michele PisaniAutore

      Ciao Raffaele, oggi per gli script c'è stato un problema dei servizi Google generale. Ho ricevuto diverse segnalazioni anche tramite altri canali. Il disservizio è stato mani a mano risolto, è probabile che qualche server sia ancora in fase di ripristino.

      Rispondi a questo commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]https://www.appsscript.it[/url] se devi riferirti ad un indirizzo web