sabato, 23 Novembre 2024

[apps script] Aggiungere un nuovo foglio a Spreadsheet controllando quelli esistenti

Vediamo come costruire una funzione che ci permetta di creare da apps script un nuovo foglio su spreadsheet ed aggiungerlo a quelli esistenti.

Notiamo che per prendere il riferimento alla cartella esistente utilizziamo:

Il nome del foglio lo vogliamo gestire nel modo seguente: se il nome che stiamo cercando di aggiungere esiste già, allora posponiamo al nome un contatore numerico scritto come (1), (2)… (n). In pratica se esiste già un foglio chiamato Primo Foglio, allora il foglio aggiunto sarà Primo Foglio (1), se esistono entrambi sarà Primo Foglio (2) ecc.

Infine restituiamo il riferimento al foglio appena creato con:

 

[apps script] Creiamo una funzione personalizzata che esegua la somma sull’intervallo di uno Spreadsheet

Oggi vediamo come creare una funzione per Spreadsheet con Google Apps Script che permetta di sommare tutti gli elementi di un intervallo passato per argomento, al pari della funzione SUM().

Faccio notare che abbiamo usato parseFloat() su tutti i valori, in modo che se venissero passati valori non numeri la funzione restituirebbe #NUM!.

Una volta inserita la funzione nello script possiamo testarla nel modo seguente:

[apps script] Inviare tramite Gmail un’email ad un elenco di contatti in Spreadsheet

Immaginiamo di avere in Spreadsheet un elenco di indirizzi email a cui vogliamo inviare un messaggio personalizzato.

A tale scopo creiamo un nuovo file con un foglio contenente degli indirizzi nel modo seguente:

Adesso creiamo un bottone al quale collegare lo script che andremo a comporre successivamente. Per aggiungere un pulsante nel foglio di calcolo dobbiamo usare un’immagine, a differenza di quanto accadeva in Excel dove si possono inserire pulsanti da interfaccia. All’immagine assoceremo poi uno script.

Per aggiungere un’immagine andiamo su Inserisci > Immagine…

Prendiamo un’immagine dal nostro computer oppure cerchiamola su Google. Dovremmo arrivare ad una situazione come questa:

A questo punto andiamo su Strumenti > Editor di script e aggiungiamo il nostro script.

Con GmailApp.sendEmail() invieremo l’email utilizzando la nostra casella di posta, mentre con Browser.msgBox() lanceremo un messaggio di conferma delle email inviate.

Fatto questo torniamo nello spreadsheet e clicchiamo col destro sull’immagine. Vedremo comparire in alto a destra dei puntini, clicchiamoci sopra per aprire il menù contestuale.

Scegliamo Assegna script… e nella finestra inseriamo il nome della nostra funzione, ovvero InviaEmailAllaLista

Fatto questo possiamo cliccare sul nostro pulsante e testare il nostro nuovo script.

Se abbiamo fatto tutto bene riceveremo un messaggio di conferma.

[javascript] Scrivere righe, colonne e formule su Google Spreadsheet utilizzando Google Apps Script (per esordienti totali)

Oggi voglio proporre un esercizio facile facile su Google Spreadsheet, l’equivalente (si fa per dire!) G Suite a Microsoft Excel.

In Excel è possibile aggiungere macro (o script) ai fogli di calcolo utilizzando VBA, mentre Google ha implementato per il medesimo risultato gli script tramite JavaScript.

Prima di cominciare vediamo il risultato che intendiamo ottenere: creare uno script che generi tre colonne di dati, contenenti rispettivamente una sequenza di ID, un elenco di prodotti pescati casualmente da un vettore, delle quantità casuali; in fondo alla tabella vogliamo scrivere il TOTALE utilizzando una funzione di somma.

Quello di sopra è ciò che vogliamo arrivare a vedere alla fine.

Cominciamo allora subito creando un nuovo foglio, che io ho chiamato test script, poi aggiungiamo uno script andando su Strumenti > Editor di script.

A questo punto si aprirà la schermata degli script dove verrà proposta una funzione base. Cancelliamola e creiamo la nostra funzione in questo modo:

Anzitutto creiamo un oggetto collegato al foglio corrente:

Con getActiveSpreadsheet() prendiamo il riferimento alla cartella di lavoro aperta in questo momento (l’equivalente di Workbook in Excel), mentre con getSheets() prendiamo il vettore di tutti i fogli nella cartella di lavoro.

Puliamo anzitutto il foglio da precedenti contenuti con:

Adesso cambiamo il nome del foglio con:

A questo punto possiamo costruire la nostra funzione per popolare il foglio con i dati come da esempio iniziale. Integrando il tutto dovremmo ottenere qualcosa di simile a questo:

Faccio notare che la somma totale dei prodotti la facciamo con =SUM(C2:C100) che impostiamo nella cella alla riga 101 e colonna 3.

Quando abbiamo fatto tutto premiamo il tasto ESEGUI (play). Se è la prima volta che eseguiamo lo script ci verrà chiesto di autorizzarlo per accedere al foglio di lavoro dal quale siamo partiti. Concediamogli l’autorizzazione.

ATTENZIONE! Comparirà una schermata di avviso come se la connessione non fosse sicura, che ci allerterà che stiamo per eseguire uno script non sicuro, dal momento che è uno script personalizzato da noi e non verificato da Google. Clicchiamo su Avanzate e procediamo.

Se tutto è andato bene avremo eseguito il nostro primo script delle Google Apps Script. 🙂

[wordpress] Fatal error: Class ‘WP_Customize_Section’ not found

Problema: WordPress risulta inaccessibile con un Fatal error: Class 'WP_Customize_Section' not found´ tipicamente localizzato su qualche file del tema

Soluzione: Il problema deriva quasi sicuramente da qualche plugin che cerca di innestarsi nel tema aggiungendo caratteristiche personalizzate. Per risolvere il problema si possono rimuovere tutti i plugin dalla cartella wp-content/plugins, tenendone una copia di backup. Se ricaricando il sito tutto torna normale si possono ricaricare, uno ad uno, i plugin rimossi fino ad individuare quello che provoca l’errore. Una volta individuato rimuoverlo. 

Nel mio caso specifico l’errore è capitato con il plugin Easy Google Fonts. Il plugin, non a caso, tenta di aggiungere funzionalità CSS al tema del sito e questo provoca delle incompatibilità.

Per risolvere il problema è stato sufficiente rimuovere il plugin dalla cartella wp-content/plugins/easy-google-fonts/

Ricordiamoci anche di rimuovere un’eventuale cache e tutti i file annessi, oltre che disabilitarla dal file wp-config.php, affinché non interferisca con la rimozione del plugin e dei codici collegati.

Fatto ciò il sito dovrebbe tornare normalmente operativo.

[mysql] #1093 – Table is specified twice, both as a target for ‘UPDATE’ and as a separate source for data

Questo errore si presenta quando si tenta di aggiornare una tabella prelevando i dati dalla medesima. Per comprendere il problema immaginiamo di avere una tabella come la seguente:

id indirizzo
1 http://indirizzosito.com/?opzione=
2 bianco
3 nero

Adesso supponiamo di volerla modificare in modo tale che il campo indirizzo all’id = 1 venga concatenato come prefisso su tutti gli altri campi indirizzo con id > 1. Quello che vogliamo ottenere è una tabella simile a questa:

id indirizzo
1 http://indirizzosito.com/?opzione=
2 http://indirizzosito.com/?opzione=bianco
3 http://indirizzosito.com/?opzione=nero

Prima di cominciare possiamo generare la tabella di prova con:

Ed inseriamo dentro i dati con:

A questo punto verrebbe spontaneo pensare che si possa utilizzare la seguente query (ATTENZIONE! Questa non funziona!):

Questa query produce però il seguente messaggio di errore:

#1093 – Table ‘t1’ is specified twice, both as a target for ‘UPDATE’ and as a separate source for data

L’errore dipende dal fatto che il database non ci consente di modificare una tabella dalla quale preleviamo contemporaneamente i dati. Possiamo aggirare il problema “ingannando” il database con la seguente modifica:

Faccio notare che a:

Abbiamo sostituito:

In questo modo la tabella viene per prima cosa prelevata e poi utilizzata per i dati dell’UPDATE.

[wordpress] Got error ‘PHP message: PHP Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0\n’

Problema: WordPress risulta bloccato on errore Server Error 500 oppure (nel registro degli errori) con Got error ‘PHP message: PHP Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0\n’

Questo problema potrebbe dipendere dalla configurazione della cache internamente a WordPress oppure da qualche plugin ad essa collegato. In generale l’errore si risolve modificando il file wp-config.php

Aprile il file e aggiungiamo, oppure modifichiamo se già esiste, la seguente riga:

In questo modo aumenteremo la memoria a disposizione della piattaforma per gestire la cache e il problema dovrebbe risultare risolto.

[vba] Creare una funzione che accetti un numero indefinito di parametri

Per questo esercizio vediamo come creare una funzione personalizzata simile (perché non andremo ad implementare tutte le alternative) al SOMMA.PIÙ.SE in VBA per Excel.

Anzitutto individuiamo le criticità:

  1. Avremo bisogno di accettare un range per la somma ed n coppie di parametri come intervalli e criteri, la nostra funzione avrà quindi la forma di FUNZIONE(somma, [intervallo 1], [criterio 1], …)
  2. I criteri possono essere numerici oppure stringhe di confronto, come per esempio “>2”

Anzitutto vediamo come creare una funzione che accetti n parametri come abbiamo definito di sopra. Per cui digitiamo in VBA:

In questo caso abbiamo inserito il minimo indispensabile, definendo il risultato come un Double, dichiarando internamente una variabile totale ed impostandola su 0. Questa variabile la utilizzeremo in seguito. L’argomento somma è di tipo Range (qui occhio agli indici, come vedremo tra poco!) e poi segue un vettore di parametri args definiti come Variant.

Per scorrere i vari parametri possiamo usare l’istruzione:

A questo punto vogliamo costruire un vettore di criteri lungo quanto l’intervallo della somma e che per ogni chiave contenga un valore equivalente a 0 oppure ad 1, in funzione che si debba o meno sommare il valore nell’intervallo somma.

Per fare questo definiamo:

Con il metodo somma.count misuriamo la dimensione del Range somma, attenzione perché il range si muove da 1 fino a somma.count, mentre il nostro vettore criteri andrà da 0 fino a somma.count – 1

Infine impostiamo tutto il vettore criteri() su 1, questo ci servirà tra poco per le operazioni logiche.

A questo punto non ci rimane che valutare tutti i criteri, tenendo presente che vanno a coppie di intervallo criteri e criterio. Perciò utilizzeremo l’istruzione:

Gli intervalli dei criteri si trovano in posizioni pari, mentre il criterio in posizione dispari.

Infine utilizzeremo il metodo Evaluate sfruttando la funzione SE di Excel per valutare ogni criterio, nel modo seguente:

Faccio notare che in Evaluate va scritta la funzione col nome in inglese. Dal momento che i criteri possono essere numerici oppure stringhe, come abbiamo detto all’inizio, dobbiamo distinguere tra le due cose e quindi scriveremo:

Infine ricordiamoci che tutti i criteri devono essere validi, quindi per modificare ogni posizione del vettore criteri() useremo il prodotto. In questo modo se sono tutti veri risulterà 1, un prodotto di tutti 1 insomma, mentre se anche un solo criterio sarà falso allora il prodotto risulterà 0, dal momento che basta uno 0 nel prodotto per azzerare tutto.

Detto tutto ciò la nostra funzione finale sarà simile a questa:

Inutile dire che la funzione potrebbe essere ulteriormente affinata per coprire tutti i possibili casi in cui può essere utilizzata SOMMA.PIÙ.SE 😉

[magento] Errore in fase di download degli ordini

Problema: quando si cerca di scaricare l’elenco degli ordini viene restituito il seguente errore MAGENTO – Errore in fase di download degli ordini System.ServiceModel.FaultException: SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine, query was: DESCRIBE sales_flat_order

Soluzione: il disco del server è pieno, probabilmente riempito dai file log di Magento stesso e non è possibile effettuare la maggior parte delle operazioni. Basta cancellare i file log oppure liberare spazio sul server.

La seguente soluzione è stata testata su Magento 1.9.3 e sistema operativo CentOS.

Anzitutto premetto che l’errore non è per forza causato da Magento, ma potrebbe trattarsi del server che per qualche motivo si è riempito (per esempio a causa di aggiornamenti). Anzitutto verifichiamo la nostra situazione digitando su server linux:

Dovremmo vedere un risultato simile al seguente:

Notiamo come la partizione / sia montata su /dev/mapper/centos-root al quale rimangono disponibili solamente 20KB di spazio.

Nella maggior parte dei casi è altamente probabile che i log di magento abbiano saturato lo spazio a disposizione. Per verificarlo spostiamoci su /var/www/sito_magento/var/log.

Digitiamo:

In questo modo dovremmo vedere qualcosa di simile a questo:

Notate che il file system.log ha superato l’assurda dimensione di 57GB! A questo punto puliamo tutti i file log, eventualmente li possiamo prima salvare da qualche parte se lo riteniamo necessario. Digitiamo:

In questo modo cancelleremo tutti i file log presenti nella cartella.

Verifichiamo nuovamente la situazione digitando:

Dovremmo vedere qualcosa di simile a quanto segue:

Notiamo che si sono liberati 56GB e abbiamo nuovamente il 44% dello spazio a disposizione.