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

Crea la tua funzione in Javascript

Funzioni personalizzate in Google Sheets con Google Apps Script

Google Sheet offre di default moltissime funzioni integrate, dalle più banali quali SOMMA (SUM), MEDIA (AVERAGE), CONCATENA (CONCAT), ecc... a quelle un po' più complesse come CERCA.VERT (VLOOKUP). Tuttavia, laddove queste funzioni non bastino a soddisfare le esigenze del momento, ecco che entrano in gioco le funzioni personalizzate.

Per definire una funzione personalizzata basta aprire l'editor di script di Google Apps Script, dal menu 'Strumenti -> Editor di script', dall'interno dello Spreadsheet nel quale ne abbiamo bisogno ed inserire la funzione di nostro interesse.

Ci sono delle regole da seguire per poter definire una funzione personalizzata in uno Spreadsheet:

- il nome della funzione non deve essere uguale a quello di un'altra funzione presente di default;
- il nome della funzione non può terminare con un underscore "_" (questo perchè l'underscore come ultimo carattere di una funzione la definisce come privata);
- la sintassi per la dichiarazione di una funzione deve essere quella classica  function myFunction() e non var myFunction = new Function();
- è possibile utilizzare anche i caratteri in minusclo (a differenza dei nomi delle funzioni integrate di default che sono scritti tutti in maiuscolo).

A scopo esemplificativo mostrerò come creare una funzione personalizzata per la conversione di un valore da gradi Celsius a gradi Fahrenheit.

Il codice da inserire all'interno dell'editor di script è il seguente:

/**
 * Convertitore Gradi Celsius in Gradi Fahrenheit
 *
 * @param {number} temp Il valore della temperatura in gradi Celsius.
 * @return Il valore della temperatura in gradi Fahrenheit
 * @customfunction
 */

function CSTOFH(temp) {
  return temp * 1.8 + 32;
}

La funzione in questione è molto semplice, il suo nome è CSTOFH (che sta per CelSius TO  FaHrenheit) ed accetta in ingresso un valore numerico sul quale effettua l'operazione di conversione dell'unità di misura per poi restituirlo.

Come mostrato nella figura seguente, Fig. 1, la funzione è utilizzabile come qualsiasi altra funzione nativamente integrata (iniziando con = e a seguire il nome della funzione, all'interno della barra delle funzioni).
Il fatto che la funzione venga mostrata all'interno del sistema di autocompletamento e che vengano visualizzati i dettagli della funzione stessa è dovuto alla parte di codice commentata sopra la funzione vera e propria (solitamente i commenti all'interno del codice non hanno effetto lato utente, in questo caso invece giocano un ruolo importante).



funzione personalizzata in spreadsheet con apps script

Fig. 1 - Funzione Personalizzata in Spreadsheet con Google Apps Script


Questa ed altre informazioni sulle funzioni personalizzate in Google Apps Script continuano nel mio libro "Punta in alto con... Google Apps Script":



punta in alto con google apps script - funzioni personalizzate

Fig. 2 - Il libro in italiano - Punta in alto con... Google Apps Script - pag 160 e 161


...E QUESTO È SOLO QUANTO RIFERITO ALL'ARGOMENTO IN OGGETTO DI QUESTO ARTICOLO!

ACQUISTA ORA IL LIBRO SU AMAZON:

punta in alto con google apps script libro italiano

Se sei pronto a diventare un esperto nella programmazione in Google Apps Script non posso fare altro che augurarti una buona lettura e soprattutto... Buon divertimento!

 

Nel caso dell'esempio in questione il codice della funzione è senza ombra di dubbio banale tuttavia è possibile creare funzioni di ben più elevata complessità che possono eseguire routine complesse, recuperare contenuti in pagine web, inviare mail, ecc...
Un altro esempio di funzione personalizzata per gli Spreadsheet si trova all'interno dell'articolo 'Tracciare in Analytics l'apertura di uno Spreadsheet con una Funzione Custom'.

Per maggiori informazioni e dettagli sulle funzioni personalizzate nei Fogli di Google rimando alla documentazione ufficiale (Custom Functions in Google Sheets).

Un modo alternativo di utilizzare le funzioni personalizzate all'interno di un Google Sheet è quello di eseguirle al click su un bottone, come descritto nell'articolo 'Bottoni che eseguono script in Spreadsheet con Google Apps Script'.

 

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

40 Commenti

  1. Sunday, September 23, 2018 alle ore 17:45 Stefano

    Ciao Michele, sto affacciandomi (con molta inesperienza!) alla tecnologia di Google Drive con la possibilità di integrarla con l'editor script e seguo con molto interesse i tuoi tutorial. Sto predisponendo un modulo per la raccolta di informazioni nella scuola dove insegno. Una volta preparato il modulo, la mia idea era quella di passare il link abbreviato del modulo ai soggetti destinatari. Mi chiedevo se fosse possibile predisporre, all'apertura del modulo, una richiesta di credenziali (username e password) per abilitarne o meno l'accesso, qualora questo link fosse utilizzato da persone non coinvolte.
    Grazie per l'attenzione

    Rispondi a questo commento
    • Sunday, September 23, 2018 alle ore 18:22 Michele PisaniAutore

      Ciao Stefano,
      non esiste una funzionalità nativa che ti permetta di proteggere un Google Form, quello che puoi fare è adottare una soluzione alternativa, che premetto non essere a prova di proiettile, ovvero puoi creare come primo elemento del form un campo richiesta con convalida dati ed impostare una password come risposta in modo che se il dato inserito non è quello giusto non è possibile passare alla parte successiva del modulo.

      Non è completamente solido come metodo in quanto se un utente ha dimestichezza con l'HTML può risalire alla password dal codice sorgente della pagina.

      Trovi il tutorial dettagliato su come 'Proteggere un Google Form con una password in modo programmatico da Apps Script' su al seguente URL: https://www.appsscript.it/tutorial/proteggere-un-google-form-con-una-password-in-modo-programmatico-da-apps-script/.

      Rispondi a questo commento
      • Monday, September 24, 2018 alle ore 08:53 Stefano

        Ciao Michele, innanzi tutto ti ringrazio per l'attenzione che mi rivolgi e per la puntualità della tua risposta. Andrò sicuramente ad approfondire l'indicazione che mi dai anche se la vedo poco praticabile, non tanto dalla possibilità di aggirarla con l'html (per i dati che trattiamo, non abbiamo l'esigenza di una "protezione blindata") quanto per il fatto che, da quello che mi scrivi, mi pare di capire che la password di convalida sarebbe uguale per tutti gli utenti (una specie di codice unico per "aprire la sbarra") e questo renderebbe troppo semplice per un utente inviare dati con il nome di altro utente. Comunque vado subito a leggere e ancora...grazie

  2. Wednesday, October 10, 2018 alle ore 13:29 MICHELE BULGARI

    ciao Michele, mi servirebbe un aiuto per attivazione di una function al verificarsi di un evento.
    In sostanza, alla data indicata in una cella vorrei che si svolgesse la funzione che ho realizzato.
    Come posso impostarla ?
    grazi

    Rispondi a questo commento
    • Wednesday, October 10, 2018 alle ore 21:01 Michele PisaniAutore

      Ciao Michele,
      direi che l'utilizzo di un trigger basato sul tempo è quello che fa al caso tuo.
      Ti basta impostare un trigger che giornalmente attiva una funzione che controlla la data nella cella specificata e se le condizioni sono sono soddisfatte fai eseguire la funzione desiderata.

      Rispondi a questo commento
  3. Thursday, October 18, 2018 alle ore 12:01 Marco P.

    Ciao Michele,
    se volessi creare una funzione che mi permetta di inserire un numero svariato di elementi (facoltativi) vedi l'esempio della Somma, come posso fare?
    Grazie

    Rispondi a questo commento
    • Thursday, October 18, 2018 alle ore 15:40 Michele PisaniAutore

      Ciao Marco,
      in quel caso quello che viene passato alla funzione è un array dove ogni elemento rappresenta il contenuto delle celle selezionate.

      Rispondi a questo commento
      • Friday, October 19, 2018 alle ore 11:29 Marco P.

        Ciao Michele,
        grazie per la risposta. Potresti cortesemente mettere un esempio?
        Grazie

        • Friday, October 19, 2018 alle ore 22:44 MichelePisaniAutore

          Ciao Marco,
          il codice non è niente di più che un semplice ciclo for su un array:

          function TESTFUNC(range) {
          mio_risultato = '';
          range_len = range.length;
          for (i=0;i<range_len;i++) {
          // ciclo il valore di ogni cella del range con 'range[i]' ed effettuo le dovute operazioni, es:
          mio_risultato = mio_risultato + range[i];
          }
          return mio_risultato;
          }


          Nel caso specifico range rappresenta l'intervallo di celle selezionato, es: A1:C3, se invece l'intervallo è dato da una singola cella allora il formato non sarà un array ma andrà gestito normalmente come nell'esempio dell'articolo.

          Nota: considerando che il valore nella cella viene letto come stringa, se l'operazione da effettuare su tali valori è un calcolo, come può essere una somma, sarà da applicare un parseFloat(range[i]) per convertire il formato in numerico.

  4. Monday, November 19, 2018 alle ore 13:28 sergio

    Michele, ciao!...forse è una domanda stupida...ma da uno che non ama Microsoft, è sicuramente comprensibile..come faccio per realizzare la funzione (che quando ero giovane usavo tantissimo...) NAME e il NAME manager di Excel in Google Sheet...
    Tks

    Rispondi a questo commento
  5. Sunday, January 13, 2019 alle ore 18:32 nicolas

    Ciao. Non so se mi puoi dare un suggerimento veloce su una cosa sulla quale sono bloccato da mesi eppure credo sia di facile soluzione ma non sono abbastanza esperto per trovarla. In pratica ho una combo con una lista dei mesi, vorrei soltanto che una volta selezionato il mese dalla combo la pagina si collochi immediatamente su quello specifico mese (il foglio è una specie di calendario di prenotazioni diviso in 12 mesi ed il nome del mese appare ad intervalli regolari e solo una volta). Come posso fare? Ti ringrazio

    Rispondi a questo commento
    • Monday, January 14, 2019 alle ore 21:00 Michele PisaniAutore

      Ciao Nicolas,
      ti basta utilizzare la funzione onEdit(), al suo interno recuperare il valore del range con e.range.getValue() e, ponendo che tale valore (corrispondente al mese selezionato) sia utilizzato anche come etichetta di un Foglio, utilizzare il metodo per posizionarsi su tale foglio in modo automatico:

      function onEdit(e) {
      var activeSheet = e.source.getActiveSheet();
      var range = e.range;
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      SpreadsheetApp.setActiveSheet(ss.getSheetByName(range.getValue()));
      }

      Ovviamente lo script necessita di essere ottimizzato ma è sicuramente funzionante.

      Rispondi a questo commento
  6. Sunday, March 24, 2019 alle ore 19:58 Giancarlo

    Ciao Michele, ti ringrazio anticipatamente per l aiuto che vorrai offrirmi e ti faccio i miei complimenti per la competenza. Io al contrario sono completamente all asciutto di programmazione e per questo ti chiedo di aiutarmi a realizzare quanto segue. Dovrei attivare una macro che ho registrato, quando in una cella con convalida dati seleziono tra le voci "Nuovo". Tale possibilità dovrà essere attribuita anche ad altre celle non contigue ma che hanno la stessa convalida, quindi nel codice dovrò indicare tutte queste celle.Grazie ancora.

    Rispondi a questo commento
    • Sunday, March 24, 2019 alle ore 21:26 Michele PisaniAutore

      Ciao Giancarlo,
      quello che puoi provare a fare è utilizzare l'onEdit(e) e verificare se il valore di e.range.getValue() è uguale a 'Nuovo'. In tal caso richiami la funzioni di tuo interesse.
      Il codice poi dovrà essere adattato con un controllo per le varie celle dove il valore 'Nuovo' può essere selezionato (questo nel caso in cui il codice deve comportarsi in modo diverso se è selezionata una cella piuttosto che un'altra).

      Rispondi a questo commento
      • Monday, March 25, 2019 alle ore 11:16 Giancarlo

        Ciao Michele, ti ringrazio per la tempestività con cui mi hai risposto. Il problema è che io sono praticamente all asciutto di qualsivoglia forma di programmazione e quello che riesco a realizzare è per adattamento di cose che altri condividono sui vari siti, quindi non saprei neanche dove cominciare. Quello che ti chiedo, se ti è possibile, è postarmi una bozza di codice che cercherò di interpretare come ho sempre fatto in passato e che cercherò di "adattare" alla mia situazione. Hai capito perfettamente quello che voglio realizzare e sicuramente con una base di partenza di codice che vorrai suggerirmi riuscirò a risolvere il mio problema. A me interessa solo che quando seleziono dal menù la voce "nuovo" attivi una macro che ho già registrato. Ci sono 15 celle che presentano la stessa convalida e devono comportarsi tutte allo stesso modo. Spero tu possa aiutarmi.So che in genere si cerca di invogliare le persone ad imparare ma ti assicuro che per quanto io sia innamorato di tutto ciò che è informatizzato, non avrò mai tempo per approfondire questa passione e mi diletto semplicemente a realizzare piccole cose che mi aiutino nel quotidiano a semplificarmi la vita. Grazie

    • Monday, March 25, 2019 alle ore 21:02 Michele PisaniAutore

      Ciao Giancarlo,
      in effetti l'intento è quello di avvicinare le persone allo sviluppo con Apps Script.

      Personalmente ti invito a cominciare ad approcciarti piano piano sia alle basi di Javascript che all'uso di Apps Script con gli strumenti della G Suite (ad esempio i Fogli di Google).

      Solo provando a sbatterci la testa scoprirai che basta veramente poco per fare grandi cose.

      Ti riporto di seguito quello che può essere definito una bozza, ma sinceramente non credo che sia un valido aiuto perché il vero aiuto è capire quello che si sta facendo:

      function onEdit(e) {
      var activeSheet = e.source.getActiveSheet();
      var range = e.range;
      if(range.getValue() == 'Nuovo') {
      // esegui la tua funzione
      }
      }



      Ti consiglio di leggere il mio libro, una risorsa in italiano adatta a tutti (sviluppatori principianti ed esperti): https://www.amazon.it/Punta-alto-Google-Apps-Script/dp/1794059393/

      Questo può essere il vero aiuto di cui hai bisogno per il resto sta a te scegliere fino a che punto spingerti.

      Rispondi a questo commento
      • Monday, March 25, 2019 alle ore 23:20 Giancarlo

        Michele ti ringrazio per tutto e proverò a seguire il tuo consiglio.

  7. Wednesday, June 26, 2019 alle ore 12:37 SALVATORE MINARDI

    ciao Michele, mi sono avvicinato da poco agli script e grazie anche al tuo libro l'apprendimento risulta essere più facilitato. Ti chiedo però un aiuto. Ho creato un foglio per la gestione degli accessi dei dipendenti e delle ditte esterne nel nostro cantiere. Tramite le caselle di controllo ho impostato una formula che mi restituisce l'ora di accesso nel momento che la casella di controllo passa a VERO(). A fine giornata, tramite script e trigger copio tutti gli orari su un altro foglio e faccio mettere tutte le caselle di controllo in FALSO(). Il problema nasce quando vengono copiati i dati sul foglio, molti valori copiati non corrispondono ai valori delle celle dove viene calcolata l'ora d'ingresso. Perchè?? Nella formula per calcolare l'ora ho utilizzato la funzione ADESSO().
    Hai qualche spiegazione?? In attesa ti saluto cordialmente

    Rispondi a questo commento
    • Friday, June 28, 2019 alle ore 00:42 Michele PisaniAutore

      Ciao Salvatore,
      hai provato ad utilizzare il parametro contentsOnly?
      Esempio:

      ss_s.getRange(2, 5).copyTo(ss_d.getRange(3, 1), {contentsOnly: true});

      Rispondi a questo commento
  8. Wednesday, May 6, 2020 alle ore 11:33 Rossella

    Ciao Michele,
    sto usando i fogli di Google per scambiare dati con colleghi in tempo reale. Ho creato una tabella di 335 records con formule e vorrei che queste si "trascinassero"automaticamente ogni volta che viene creato un nuovo record. Anche se sono totalmente a digiuno di script ho provato a registrare una macro (che mi chiede l'accesso ogni volta che provo ad utilizzare per vedere se la fonte è attendibile e vorrei bypassare la cosa). Per inserire il record 336 funziona, ma dal 337 non più. Mi sembra di avere capito che fa riferimento ad una specifica cella e la riga dopo quella, come faccio a dare un riferimento relativo? Posso poi importarla poi su altri fogli identici che dovranno compilare degli omologhi?


    function Inserisci_record() {
    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.getRange('A335').activate();
    spreadsheet.getActiveSheet().insertRowsAfter(spreadsheet.getActiveSheet().getMaxRows(), 1);
    spreadsheet.getRange('A336').activate();
    var currentCell = spreadsheet.getCurrentCell();
    spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.NEXT).activate();
    currentCell.activateAsCurrentCell();
    spreadsheet.getActiveRangeList().setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
    spreadsheet.getRange('G335:H335').activate();
    spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('G335:H336'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
    spreadsheet.getRange('P336').activate();
    spreadsheet.getRange('P335').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    spreadsheet.getRange('Y336').activate();
    spreadsheet.getRange('Y335').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    spreadsheet.getRange('AK336').activate();
    };


    Rispondi a questo commento
    • Wednesday, May 6, 2020 alle ore 14:11 Michele PisaniAutore

      Ciao Rossella,
      laddove nel tuo script sono presenti riferimenti specifici a una cella (riga e/o colonna) dovrai sostituirli con quelli dinamici, ovvero utilizzando i metodi ad esempio per determinare l'ultima riga, in modo da aggiungere quella nuova dopo l'ultima che contiene valori. In tal caso il metodo è getLastRow().

      Nella documentazione ufficiale trovi un esempio di come richiamare tale metodo:

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheets()[0];

      // This logs the value in the very last cell of this sheet
      var lastRow = sheet.getLastRow();
      var lastColumn = sheet.getLastColumn();
      var lastCell = sheet.getRange(lastRow, lastColumn);
      Logger.log(lastCell.getValue());



      Per maggiori dettagli: https://developers.google.com/apps-script/reference/spreadsheet/sheet#getlastrow

      Rispondi a questo commento
  9. Saturday, November 21, 2020 alle ore 20:10 Marco Barontini

    Ciao Michele, innanzitutto complimenti per il tuo libro. Non l'ho ancora letto tutto ma si è aperto uno spiraglio su un nuovo mondo.
    Il mio primo passo sarebbe quello di riuscire ad automatizzare la creazione di nuovi sheet (magari inserendo il comando sul menù, come da te spiegato sul libro) denominati con i mesi dell'anno (ovviamente se lavoro su "gennaio 2020" dovrà creare lo sheet "febbraio 2020" ecc..
    Per questo credo si debbano utilizzare le array dove si specificano i mesi, ma successivamente non riesco a far capire che deve creare i fogli in sequenza. Lo script così com'è mi crea un unico foglio denominato con il nome tutti i mesi insieme :(
    Lo lascio qua sotto, grazie mille.

    function crearesheet() {
    var spreadsheet = SpreadsheetApp.getActive();
    var mesi = ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"]
    spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Foglio1'), true);
    spreadsheet.duplicateActiveSheet();
    spreadsheet.getActiveSheet().setName(mesi);
    spreadsheet.moveActiveSheet(0);
    };


    Rispondi a questo commento
    • Sunday, November 22, 2020 alle ore 15:34 Michele PisaniAutore

      Ciao Marco,
      grazie dei complimenti e del feedback :)

      Dal tuo codice vedo che ci sono dei passaggi mancanti per poter ottenere quanto desideri. La funzione che stai eseguendo crea un unico foglio e come nome gli associa l'intero contenuto dell'array. Quello di cui invece hai bisogno è effettuare un ciclo su quell'array in modo che ad ogni iterazione, per ogni suo elemento, crei un nuovo foglio e associando il nome del relativo elemento dell'array.

      Nel primo capitolo del libro (a pagina 52 se hai il cartaceo) trovi un semplice esempio di come accedere agli elementi dell'array in base alla loro posizione. Una volta che quel concetto diventa chiaro, puoi inserire l'array in un ciclo in modo da accedere automaticamente a tutte le posizioni.

      Rispondi a questo commento
  10. Sunday, March 21, 2021 alle ore 14:53 Fabrizio

    Ciao Michele, adoro la programmazione ma purtroppo non ho molto tempo da dedicarmici, sono un buon amatore, diciamo così.
    Ho una cosa un pò complessa da fare e spero di riuscire a spiegarmi adeguatamente.
    Io ho un form che già mi riempie un foglio (Lista preventivi). I primi campi, o celle, dichiarano il nome della persona es. "Fabrizio" (C2) ed il nome di un appartamento es. "Casa GiuLara"(D2).
    Io ho preparato un Foglio Modello e lo ho chiamato "Preventivo Host" che contiene varie pagine già preimpostati e zeppe di formule e importrange di altri fogli esterni al file e o pagine interne allo stesso.
    Ciò che vorrei fare io è: che ogni volta che arriva una nuova riga nel foglio "Lista Preventivi" (quindi ogni volta che un cliente riempie un form) un comando (funzione) in automatico mi crei un nuovo file prendendo come modello il file "Preventivo Host" e gli assegnasse il nome "Host 0001(numero di riga di dove sta il nuovo entrato, dove il numero di riga è espresso in 4 cifre 0001-0002-0003 ..... 9999) diviso con un trattino e che aggiunge il nome dell'appartamento (D2) e separato da un trattino il nome del proprietario (C2). In pratica il nome del file dovrebbe essere il seguente "Host0001 - Casa GiuLara - Fabrizio".
    Nel file modello, quindi il "Preventivo Host" la prima pagina è già denominata "Or Host" e sarebbe la pagina dove vengono trasferiti (tutta la riga N°1 dove ci sono le domande del form e tutta la riga NUOVA che è arrivata dal form ) i dati. Tutto questo finora lo ho fatto a mano copiando e incollando (Ufffff). Da questo punto, ho risolto con una Macro ma non automatica, debbo cliccare su un bottone, per prendere questi dati in riga e copiarli, con TRANSPOSIZIONE (, quindi in colonna, in un'altra pagina chiamata "Valutazione", dove le domande del form andranno in colonna a partire da A6 e le risposte, sempre in colonna a partire da B6.
    Arrivati a questo punto, il foglio compila automaticamente il preventivo!
    Sono molti passaggi che fatti a mano ti prendono piu di 20 minuti ogni nuova riga che arriva nel foglio "Lista Preventivi", onestamente vorrei automatizzarlo. E' possibile?
    Ti chiedo già scusa per le informazioni che non ti ho dato ma che sicuramente ti serviranno, chiedi pure! hahaha

    P.s. tento di riassumere tutto il processo: Il potenziale cliente riempie un form che viene registrato su un file. Ogni nuovo "cliente" mi si genera un nuovo file (da modello) con nome formato da ("Host+numerodiriga" - "Nome casa" - "Nome cliente") contenente tutte le domande del form e le risposte del singolo cliente. Da questa pagina, debbo prendere i dati (che stanno sistemati in riga) e portarli su un'altra pagina (sistemandoli in colonna).
    I valori cosi trasportati genereranno in automatico il preventivo!

    Grazie Michele se riesci a darmi una mano. Se ti servono altre informazioni o link, chiedi pure.
    Fabrizio

    Rispondi a questo commento
    • Sunday, March 21, 2021 alle ore 17:04 Michele PisaniAutore

      Ciao Fabrizio,
      dal punto di vista tecnico direi che la realizzazione di questo sistema è possibile. Per essere certi sono necessari ulteriori dettagli per capire ad esempio come utilizzi le formule e se queste in qualche modo richiedono di essere gestite lato codice.
      Non è ovviamente qualcosa che può essere risolta qui nei commenti o che richiede pochi minuti per essere realizzata, si tratta di una vera e propria commessa di lavoro.
      Pertanto per il momento posso dirti che se vuoi ottenere il risultato in autonomia i metodi per creare un nuovo foglio, rinominarlo, leggere/scrivere i dati interagendo con le celle, ecc... esistono e li trovi nella documentazione ufficiale https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app. Puoi ache utilizzare un attivatore per eseguire lo script automaticamente anziché farlo a mano tramite il bottone che hai creato.
      Se invece hai bisogno di un preventivo scrivimi nel form che trovi nella pagina dei contatti oppure iscriviti gratuitamente al Gruppo su Facebook 'Fatti di Apps Script' dove potrai trovare altri sviluppatori e appassionati disposti a darti una mano: https://www.facebook.com/groups/AppsScript

      Rispondi a questo commento
  11. Saturday, April 17, 2021 alle ore 20:36 Maurizio Cecotti

    Salve. Avrei bisogno della sua esperienza per un problema che non riesco a risolvere.
    Lo scenario è il seguente:
    Macchina che produce dei pezzi che vengono immaggazzinati in una scatola.
    La quantità titale della scatola è nota e posso rilevare il contenuto in pezzi in ogni momento.
    Conoscendo la produzione oraria posso calcolare quanto manca al completamento della scatola in fase di riempimento.
    A questo punto voglio conoscere l'ora precisa in cui la scatola sarà piena.
    Utilizzando la funzione NOW () ottengo quanto desiderato ma il risultato si aggiorna continuamente.
    Quindi... nella mia tabella ho:
    in B2 i pezzi rilevati istantaneamente
    in B3 la produzione oraria
    in B4 il tempo mancante al completamento della scatola
    in B5 l'ora di fine riempimento.
    Avrei bisogno che il valore in B5 rimanga fisso fino a che non venga inserito un nuovo valore in B2.
    Mi scuso per la lunghezza del messaggio e ringrazio per l'attenzione.

    Rispondi a questo commento
    • Saturday, April 17, 2021 alle ore 22:48 Michele PisaniAutore

      Ciao Maurizio,
      non ho chiaro se il resto dei dati, a parte l'ora corrente, è ottenuto tramite formule nello Sheet oppure da script. Ad ogni modo, se non ho capito male, quello stai cercando di ottenere può essere gestito tramite gli script. Ad esempio in base a B2, ovvero il numero di pezzi costantemente presenti nella scatola, può essere applicata una condizione in modo tale da mostrare il valore dell'ora corrente in tutti i casi tranne quando in B2 si trova il numero massimo di pezzi contenuti in una scatola. A quel punto invece di mostrare il valore corrente potrà essere mostrato l'ultimo rilevato ovvero quello associato al momento del completamento della scatola (che può essere salvato in una variabile, in cache o in una Proprietà).

      Rispondi a questo commento
  12. Tuesday, April 20, 2021 alle ore 10:30 Maurizio Cecotti

    Grazie per esserti occupato della cosa.
    Vediamo se riesco ad essere più chiaro:
    A casa ho un rubinetto che perde. Ci metto sotto un secchio da 20 litri che andrà vuotato più volte al giorno.
    Creo una tabella dove:
    B2 = quantità di acqua presente nel secchio in un momento qualsiasi (es. inserisco 2 (litri) alle ore 7.00)
    B3 = portata della perdita (es. 3 litri/h)
    B4 = calcolo del tempo rimanente al riempimento del secchio (semplici operazioni matematiche)
    B5 = Ora in cui dovrò vuotare il secchio (NOW () + B4)

    A questo punto chiudo il foglio. Dopo un po di tempo non ricordo più a che ora dovevo vuotare il secchio... riapro il foglio ma istantaneamente il valore di B5 cambia (poiché è cambiato il valore di NOW () )
    Quindi... mi serve che la somma NOW+B4 venga calcolata solo se cambio il contenuto di B2, al contrario il valore di B5 deve rimanere quello dell'ultimo calcolo effettuato cosicché possa consultarlo in qualsiasi momento.

    Purtroppo non ho pratica con gli script e queato caso mi serve anche per capire se investire il mio tempo nella loro comprensione.

    Grazie ancora per l'aiuto.

    Rispondi a questo commento
    • Wednesday, April 21, 2021 alle ore 23:04 Michele PisaniAutore

      Ciao Maurizio,
      probabilmente mi sto perdendo un passaggio, non mi torna molto il motivo per cui B5 dovrebbe cambiare. Se si tratta di una somma tra il tempo di ora e il tempo rimanente, nel momento in cui riapro il file dopo 10 minuti avrò (immagino) che anche B4 è stato ricalcolato e varrà 10 minuti meno mentre NOW() varrà 10 minuti in più di prima. Quindi l'orario in B5 non dovrebbe cambiare (a meno che il secchio sia pieno e a quel punto NOW() supera il tempo limite... ma l'acqua sarebbe già fuoriuscita).

      Ad ogni modo, se invece in B4 il valore è fisso uno script potrebbe sicuramente togliere il problema. Indipendentemente da quanto scritto sopra. Al momento della modifica in B2 potresti eseguire una funzione all'onEdit() che calcola il momento corrente + B4 e lo scrive in B5. In questo modo il valore in B5 rimarrà statico fino a che non modifichi di nuovo B2.

      Rispondi a questo commento
  13. Wednesday, April 21, 2021 alle ore 23:51 Maurizio Cecotti

    Esatto: il valore di B4 è fisso in quanto calcolato sulla base di B2 e B3 ((20-B2)/B3). Quindi mi serve uno script che faccia esattamente quanto hai ipotizzato. Saresti così gentile da crearne uno? Lo so che è una cosa banale ma pur avendoci provato non riesco a farlo funzionare.
    E purtroppo non trovo casi simili al mio sul web...
    Ti ringrazio per il tuo tempo e la tua pazienza

    Rispondi a questo commento
    • Thursday, April 22, 2021 alle ore 09:22 Michele pisaniAutore

      Ciao Maurizio,
      la mia mission è un'altra. Ho dedicato del tempo a darti supporto, per rassicurarti che investire il tuo tempo nella comprensione degli script è una cosa sensata. Lo script è 'banale' adesso, dopo che ci ho studiato e può essere più o meno banale crearlo per chi ha speso tempo giorno dopo giorno a studiare gli script. Sicuramente non è immediato e richiede alcune prove, sono certo tuttavia che adesso che sei stato indirizzato sulla strada giusta, consapevole del fatto che il risultato è ottenibile, con studio e passione riuscirai a farlo funzionare. La soddisfazione che ne trarrai sarà molto superiore al risultato.

      Rispondi a questo commento
  14. Friday, April 23, 2021 alle ore 02:17 Maurizio Cecotti

    Ho risolto. Grazie per le indicazioni

    Rispondi a questo commento
  15. Wednesday, May 26, 2021 alle ore 11:11 LUCA MARIA

    Buongiorno,
    Devo creare un file excel dove all'inserimento di un valore nella cella a2 che sia>=1 deve automaticamente scrivere nella cella b2 l'ora esatta.
    Tramite la funzione adesso sono riuscito nel mio intento solo che ad ogni aggiornamento del file la cella si modifica in base all'ora corrente. Come posso 'bloccare' la cella b2?

    Rispondi a questo commento
    • Wednesday, May 26, 2021 alle ore 17:30 Michele PisaniAutore

      Ciao Luca,
      potresti usare una cella come flag impostando ad esempio ad 1 il suo valore dopo che scrivi la prima volta l'ora in b2 e impostando un controllo che se quel flag è uguale a 1 allora non aggiorni il valore.

      Rispondi a questo commento
  16. Thursday, March 9, 2023 alle ore 14:54 Giacomo

    Buongiorno Stefano ho provato a seguire il tuo tutorial per creare uno script ma ora nella sezione strumenti non mi appare "script editor" e se clicco su estensioni -> AppScript mi apre una pagina bianca di errore 400. Mi capita lo stesso se provo a dare le autorizzazioni per installare componenti aggiuntivi. Mi dice di provare a cancellare i cookie ma la situazione non cambia dopo averlo fatto.


    Ho bisogno di creare un rendiconto su un foglio per avere sempre aggiornato il totale delle campagne pubblicitarie. Ho una cella in cui viene fatta la somma di tutti i budget giornalieri e vorrei che il valore in questa cella venisse aggiunto ogni 24h alla cella in cui c'è il totale speso fino al giorno prima. Spero tu possa indicarmi un modo per farlo.

    In ogni caso grazie in anticipo!

    Rispondi a questo commento
  17. Thursday, March 9, 2023 alle ore 14:55 Giacomo

    Buongiorno Stefano ho provato a seguire il tuo tutorial per creare uno script ma ora nella sezione strumenti non mi appare "script editor" e se clicco su estensioni -> AppScript mi apre una pagina bianca di errore 400. Mi capita lo stesso se provo a dare le autorizzazioni per installare componenti aggiuntivi. Mi dice di provare a cancellare i cookie ma la situazione non cambia dopo averlo fatto.


    Ho bisogno di creare un rendiconto su un foglio per avere sempre aggiornato il totale delle campagne pubblicitarie. Ho una cella in cui viene fatta la somma di tutti i budget giornalieri e vorrei che il valore in questa cella venisse aggiunto ogni 24h alla cella in cui c'è il totale speso fino al giorno prima. Spero tu possa indicarmi un modo per farlo.

    In ogni caso grazie in anticipo!

    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