google-apps-script google - Script per riepilogare i dati non aggiornati




3 Answers

Ti manca la fastidiosa funzionalità di caching bug . Funziona in questo modo:

Google ritiene che tutte le funzioni personalizzate dipendano direttamente solo dai valori dei parametri per restituire i loro risultati (si può opzionalmente dipendere da altri dati statici).

Dato questo prerequisito possono valutare le tue funzioni solo quando un parametro cambia. per esempio

Supponiamo di avere il testo "10" sulla cella B1, quindi su un'altra cella =myFunction(B1)

myFunction verrà valutato e il suo risultato recuperato. Quindi, se si modifica il valore della cella B1 su "35", le personalizzazioni verranno rivalutate come previsto e il nuovo risultato verrà recuperato normalmente. Ora, se si modifica nuovamente la cella B1 nell'originale "10", non c'è alcuna rivalutazione, il risultato originale viene recuperato immediatamente dalla cache.

Pertanto, quando si utilizza il nome del foglio come parametro per recuperarlo in modo dinamico e restituire il risultato, si interrompe la regola di memorizzazione nella cache.

Sfortunatamente, non puoi avere funzioni personalizzate senza questa fantastica funzionalità. Quindi dovrai cambiarlo per ricevere direttamente i valori, invece del nome del foglio, o non usare una funzione personalizzata. Ad esempio, potresti avere un parametro sul tuo script che onEdit dove dovrebbero andare i sommari e avere un onEdit li aggiorna ogni volta che un totale cambia.

scripts get

Ho un foglio di calcolo Google dei dati della scheda attività; ha un foglio per ogni mese, ogni foglio è composto da sei blocchi di colonne, un blocco per cliente.

Ho creato un foglio di riepilogo che va e ottiene il totale per ogni cliente e lo visualizza in una lista:

function getClientTotals(sheetname, colcount)
{  
  colcount = colcount ? colcount : 6;
  var res;      
  var ss = SpreadsheetApp.openById('myid_goes_here');
  if(ss)
  {
    res = [];
    var totrow = ss.getRange(sheetname + '!A1:ZZ1').getValues()[0];
    for(var i = 0; i < totrow.length; i += colcount)
    {
      res.push([totrow[i], totrow[i + colcount - 1]]);
    }
  }   
  return res;
}

Ho quindi appena aggiunto una cella al mio foglio di riepilogo contenente =getClientTotals($C$7,$C$8) che passa nel nome del foglio per il mese e il numero di colonne per ogni client (nel caso di modifiche allo "schema".

Funziona tutto bene, tuttavia, non si aggiorna quando i dati di origine vengono modificati. Ho aggiunto un trigger onEdit ; nessuna gioia. Si aggiorna se vai all'editor degli script e premi Salva, ma non è utile. Mi sto perdendo qualcosa?




Ho avuto un problema simile creando un dashboard per il lavoro. La soluzione di Chamil sopra (vale a dire l'uso della funzione Filter's Sheet passata come valore a una variabile fittizia nella tua funzione) funziona bene, nonostante il commento più recente di Arsen. Nel mio caso, stavo usando una funzione per monitorare un intervallo e non potevo usare il filtro sullo stesso intervallo poiché ha creato un riferimento circolare. Quindi ho appena avuto una cella (nel mio caso E45 nel codice qui sotto) in cui ho cambiato il numero ogni volta che volevo aggiornare la mia funzione:

=myFunction("E3:E43","D44",filter(E45,1=1))

Come indicato da Chamil, il filtro non è utilizzato nella sceneggiatura:

function myFunction(range, colorRef, dummy) {
  variable 'dummy' not used in code here
}



Dato che la funzione è stata spiegata da Henrique Abreu, puoi provare la funzione di foglio di calcolo QUERY , che la query di SQL è quella che uso spesso per lavorare sui dati grezzi e ottenere i dati come riepilogo in una scheda diversa, i dati dei risultati vengono aggiornati in tempo reale in seguito al cambiamento nei dati grezzi.

Il mio suggerimento si basa sul fatto che il tuo script non ha lavoro avanzato come il recupero dell'URL, solo i dati funzionano, perché senza la lettura dei dati reali, non riesco a dare una soluzione precisa con QUERY.

Per quanto riguarda la funzione cache menzionata da Henrique Abreu (non ho abbastanza reputazione per commentare direttamente sotto la sua risposta), ho fatto dei test e ho scoperto che:

  1. sembra che non ci sia cache funzionante, testando lo script della funzione mostrato di seguito:

    function adder (base) {Utilities.sleep (5000); base di ritorno + 10; }

applicando la funzione personalizzata adder () nel foglio chiamando una cella, e poi ha cambiato il valore di cella avanti e indietro, ogni volta che vedo il messaggio di caricamento e il tempo totale più di 5 secondi. Potrebbe essere correlato all'aggiornamento menzionato in questo problema GAS:

Questo problema è stato risolto Le funzioni personalizzate in Nuovi fogli sono ora a conoscenza del contesto e non memorizzano i valori in modo aggressivo.

  1. il problema citato in questo argomento rimane, i miei test suggeriscono che, foglio Google ricalcolare la funzione personalizzata ogni volta SOLO QUANDO

    • il valore DIRECTLY chiamato dalla funzione è cambiato.

    function getCellValue (sheetName, row, col) {var ss = SpreadsheetApp.getActiveSpreadsheet (); var sh = ss.getSheetByName (sheetName); return sh.getRange (row, col) .getValue (); }


    Una modifica di qualsiasi valore in celle gialle porterà al ricalcolo della funzione personalizzata; la vera modifica del valore della sorgente dati viene ignorata dalla funzione.

    • la funzione che contiene la posizione della cella viene cambiata nel foglio. ex. inserisci / rimuovi una riga / colonna sopra o sul lato sinistro.



Related

google-apps-script google-spreadsheet google-apps custom-function