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

doGet() e parametri in querystring

Creare un Web Service o una RESTful API con Google Apps Script

Tra le modalità con le quali può essere resa disponibile, ovvero interrogabile, dall'esterno una funzione in Google Apps Script è presente quella relativa alla distribuzione come API eseguibile, come mostrato nell'articolo 'Interrogare una funzione in Google Apps Script da Remoto con le Execution API'.
Nel caso specifico la procedura segue una serie di passaggi che coinvolgono la Google Console per la generazione di credenziali di autenticazione e successiva implementazione di librerie ed impostazioni dedicate al fine di potersi interfacciare da remoto con l'API personalizzata.

Esiste tuttavia un modo più semplice e veloce per creare una propria API (o un web service), sempre interrogabile da remoto, basato sulla distribuzione dello script come applicazione web anziché come API eseguibile.

Prima di entrare nel cuore della praticità riporto alcuni requisiti chiave da best practice, da tenere in considerazione, che un'API pragmatica progettata per le applicazioni web dovrebbe avere (la lista seguente, sicuramente non esaustiva, non rappresenta uno standard bensì vuole essere solo una modalità di approccio).
Una API:

- Dovrebbe usare gli standard web dove ha senso che siano applicati;
- Dovrebbe essere scritta in modo chiaro affinché sia facilmente manutenibile dallo sviluppatore;
- Dovrebbe essere esplorabile tramite la barra degli indirizzi del browser;
- Dovrebbe essere semplice, intuitiva ed efficiente per agevolarne l'utilizzo.

Un esempio di creazione di un'API, o servizio web, potrebbe essere quello di rendere disponibile all'esterno la lista dei prodotti venduti in un ecommerce, mettendo a disposizione le relative informazioni di nome, descrizione, prezzo, categoria, quantità in magazzino, ecc..., con la finalità di permettere a servizi esterni di poter gestire tali dati all'interno delle loro applicazioni.

L'esempio riportato di seguito si basa su uno script, presente su GitHub, chiamato gas-rest-api che in pratica, dopo essere rilasciato come applicazione web e pertanto interrogabile tramite un link pubblico, in base ai parametri passati legge da uno Spreadsheet le righe dei prodotti richiesti e fornisce una risposta in JSON sul sistema che ha effettuato la chiamata.

La scelta di ottenere una risposta in JSON anziché in altri formati di interscambio dati, come ad esempio l'XML, è dovuta (parlando sempre di best practice) alla praticità di utilizzo del JSON che ad oggi è affermato come standard in molti progetti, basta osservare la sua tendenza nel tempo rispetto all'XML, Fig. 1:



google trends - json api in confronto con le xml api

Fig. 1 - Confronto tra le JSON API e le XML API in Google Trends


Per visualizzare i dati aggiornati alla data corrente potete fare riferimento a Google Trends per la chiave di ricerca JSON API vs XML API.

Lo script può essere di tipo standalone, che recupera lo Spreadsheet desiderato tramite il suo id con il metodo SpreadsheetApp.openById(id), come nel caso dell'esempio originale oppure essere integrato nello Spreadsheet stesso (si parla quindi di bound script) come nella versione proposta di seguito dove le istanze dello Spreadsheet e del relativo foglio di calcolo vengono recuperate con gli specifici metodi di script associati, tra i quali ad esempio SpreadsheetApp.getActiveSpreadsheet().

La lista dei prodotti sui quali lo script agirà è la seguente, Fig. 2:



lista esemplificativa di prodotti all'interno di uno spreadsheet

Fig. 2 - Lista esemplificativa di prodotti all'interno di uno Spreadsheet


Il codice Apps Script da inserire all'interno dell'editor associato allo Spreadsheet (dal menu 'Strumenti' del Foglio di Calcolo selezionare la voce 'Editor di script...') è il seguente:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var rng = ss.getDataRange();
var data = rng.getValues();
var headings = data[0];

/*
Recupera le informazioni dell'ID (SKU) di prodotto specificato
Esempio: [1.0, Camicia per uomo, Camicia elastica di fibra di bambù, 20.39, 0.21, http://esempio.it/01.jpg, Abbigliamento, 5.0, EUR]
*/
function productQuery(prodId) {
  for (var i = 1; i < data.length; i++) {
    if (prodId == data[i][0]) {
      return data[i];
    }
  }
}

/* Recupera le informazioni dell'ID (SKU) di prodotto specificato e le converte in un oggetto formando coppie chiave:valore con i rispettivi nomi delle colonne presenti nell'header dello Spreadsheet */
function formatProduct(rowData) {
  var product = {}
  for (var i = 0; i < headings.length; i++) {
    product[headings[i].toString()] = rowData[i];
  }
  return product;
}

//... trovi il codice integrale qui: https://www.amazon.it/Punta-alto-Google-Apps-Script/dp/1794059393/

Il codice integrale e molte altre informazioni su come creare un Web Service o una RESTful API con Google Apps Script continuano nel mio libro "Punta in alto con... Google Apps Script" (gli script sono scaricabili, funzionanti e liberamente utilizzabili nelle proprie applicazioni):



punta in alto con google apps script - web services e restful api

Fig. 3 - Il libro in italiano - Punta in alto con... Google Apps Script - pag 384 e 385


...E QUESTO È SOLO QUANTO RIFERITO ALLA CREAZIONE DI WEB SERVICES CON GOOGLE APPS SCRIPT!

ACQUISTA ORA IL LIBRO SU AMAZON:

punta in alto con google apps script libro italiano

Troverai anche informazioni sulla relativa 'Distribuzione come applicazione web...' e gli opportuni settaggi nonché la configurazione di Postman per l'ottenimento del corretto risultato in formato JSON:



chiamata in get con parametri ad uno script in apps script tramite postman

Fig. 4 - Chiamata in GET con parametri ad uno script in Apps Script tramite Postman


Sulla base di questo script è possibile creare ulteriori API, come ad esempio per la richiesta di tutti i prodotti di una determinata categoria o dei prodotti all'interno di una determinata fascia di prezzo e quant'altro possa essere di aiuto per fornire un servizio web completo e facile da usare da altri servizi esterni.

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

2 Commenti

  1. Thursday, October 29, 2020 alle ore 13:09 MAX

    buon giorno , suo fogli e possibile nascondere disattivare la barra del menu , con i simboli?
    perche ho capito che si creano degli script e si accede da questa barra menu,
    ma una persona che da questo foglio per lavorare ad altri, crea le protezioni sui titoli , su alcune celle di formule etcc ma non puo proteggere, dal entrare in questo menu / strumenti /editor di script , perche non si puo nascondere , o bisogna creare una macro all apertura del foglio che attiva / menu/ visualizza / schermo intero, e lo tiene bloccato, fino alla chiusura ? ed disattivare il tasto ecc della tastiera ? io sto diventando matto, a cosa serve creare script se non si puo proteggerli !!! da collaboraotri curiosi che vanno a fare casini ? grazie

    Rispondi a questo commento
    • Thursday, October 29, 2020 alle ore 13:29 Michele PisaniAutore

      Ciao Max,
      poiché il tuo commento non ha pertinenza con l'articolo in questione, ti rimando ad una pagina dove ci sono alcune ipotesi risolutive di cui una sicuramente fa al caso tuo: https://www.appsscript.it/articoli/come-proteggere-il-codice-apps-script-in-un-foglio-di-lavoro-google/

      [UPDATE]
      Ho creato anche un video sull'argomento che penso possa chiarire i tuoi dubbi ed offrirti soluzioni efficaci: https://www.youtube.com/embed/EQiv76EodUE

      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