La necessità è di sistemare alcune "anomalie" delle funzioni in esso previste tramite tasti che eseguono questi script, che di seguito descrivo:
1) Funzione "aggiornabiro"
La funzione prende la situazione registrata dalle scansioni barcode Android dal "Foglio1" e le sposta nel foglio "StoricoMovimentazioni".
Il problema da risolvere è che come è fatto mi copia sempre tutte le situazioni attuali, andandomi a creare nello storicoMovimentazioni anche numerosi doppioni nel caso certi articoli NON SIANO stati movimentati.
LA mia necessità sarebbe correggere lo script in modo che copi la situazione attuale dell'articolo SOLO se la sua ubicazione è stata MODIFICATA, in modo da avere nello storico tutti gli spostamenti EFFETTIVI per articolo.
Questo è il codice attuale:
- Codice: Seleziona tutto
function aggiornaBiro() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Foglio1");
const storicoSheet = ss.getSheetByName("StoricoMovimenti");
if (!sheet || !storicoSheet) {
SpreadsheetApp.getUi().alert("Assicurati che i fogli 'Foglio1' e 'StoricoMovimenti' esistano.");
return;
}
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 3).getValues();
const biroMap = new Map();
const cassettiDescrizione = {
"C01": "Carminati",
"C02": "Timbro",
"C03": "DRO",
"C04": "NT",
"C05": "EVOL"
};
data.forEach((row, index) => {
const codiceBiro = row[0];
let codiceCassetto = row[1];
if (codiceBiro && codiceCassetto) {
if (cassettiDescrizione[codiceCassetto]) {
codiceCassetto = cassettiDescrizione[codiceCassetto];
}
biroMap.set(codiceBiro, { index: index + 2, cassetto: codiceCassetto });
}
});
sheet.getRange(2, 1, sheet.getLastRow() - 1, 3).clearContent();
let riga = 2;
biroMap.forEach((value, codiceBiro) => {
const timestamp = new Date();
sheet.getRange(riga, 1).setValue(codiceBiro);
sheet.getRange(riga, 2).setValue(value.cassetto);
sheet.getRange(riga, 3).setValue(timestamp);
// Aggiunge il movimento allo storico
storicoSheet.appendRow([timestamp, codiceBiro, value.cassetto]);
riga++;
});
}
2) Funzione "EvidenziaBiroInattive"
Questa funzione che agisce sul foglio "storicomovimentazioni" va ad evidenziare gli articoli che non sono stati movimentati negli ultimi XX giorni (il numero viene richiesto in fase di esecuzione dello script).
Il problema è che lo script funziona se pulisco i record nel foglio "Storicomovimentazioni" e aggiorno i dati per la prima volta, ma poi dai successivi aggiornamenti e relativi caricamenti nello storico, lo sript non funziona piu' (non evidenzia piu' le righe con date piu' vecchie).
Questo è il codice:
- Codice: Seleziona tutto
function evidenziaBiroInattive() {
const ui = SpreadsheetApp.getUi();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const storicoSheet = ss.getSheetByName("StoricoMovimenti");
if (!storicoSheet) {
ui.alert("Il foglio 'StoricoMovimenti' non esiste.");
return;
}
const risposta = ui.prompt("Inserisci il numero di giorni per cercare biro ferme (es. 30)");
const sogliaGiorni = parseInt(risposta.getResponseText());
if (isNaN(sogliaGiorni)) {
ui.alert("Valore non valido.");
return;
}
const data = storicoSheet.getRange(2, 1, storicoSheet.getLastRow() - 1, 3).getValues();
const ultimaDataBiro = new Map();
data.forEach(row => {
const dataMovimento = new Date(row[0]);
const codiceBiro = row[1];
if (codiceBiro && (!ultimaDataBiro.has(codiceBiro) || dataMovimento > ultimaDataBiro.get(codiceBiro))) {
ultimaDataBiro.set(codiceBiro, dataMovimento);
}
});
storicoSheet.getRange(2, 1, storicoSheet.getLastRow() - 1, 3).setBackground(null);
const oggi = new Date();
data.forEach((row, index) => {
const codiceBiro = row[1];
const ultimaData = ultimaDataBiro.get(codiceBiro);
const giorniInattivi = Math.floor((oggi - ultimaData) / (1000 * 60 * 60 * 24));
if (giorniInattivi >= sogliaGiorni) {
storicoSheet.getRange(index + 2, 1, 1, 3).setBackground("yellow");
}
});
ui.alert("Biro inattive da più di " + sogliaGiorni + " giorni evidenziate.");
}
Grazie infinite a tutti.