Invio ora non corretta (+1h e 21 min)

forumauro

Nuovo Utente
24 Gen 2025
2
0
1
Buongiorno a tutti. Questa la mia situazione:
Ho un modulo Google che trasmette ad un foglio i dati per richiedere le ferie i quali includono l'ora (nel caso in cui una persona voglia prendere solo 4 ore di permesso).
Dal foglio posso, tramite una funzione inviare una mail, accettando o rifiutando la richiesta.
Inviando la mail accettando la richiesta, viene inviata la mail all'utente con data e ora delle ferie (o permessi) richiesti come promemoria ma.....l'ora esce sempre sbagliata e all'orario indicato vengono aggiunti 81 minuti ovvero 1 ora e 21 minuti, e non riesco a capire dove si trovi l'errore. Tutto il resto è corretto e funziona. Viene anche aggiornato un calendario con le date e l'orario, ma quest'ultimo sempre con 1h e 21 minuti in più.

Esempio:
Chiedo ferie il giorno x dalle 08:30 alle 12:30

La mail inviata per conferma mi segna il giorno x corretto mentre l'orario è: dalle 9:51alle 13:51.

Il codice è il seguente:

Codice:
const CALENDAR_ID = "ID CALENDAR"; // Sostituisci con il tuo ID del calendario

const AUTORIZED = true;

const REJECTED = false;



function onOpen() {

var ui = SpreadsheetApp.getUi();

ui.createMenu('Verifica')

.addItem('Autorizza', 'authorize')

.addSeparator()

.addItem('Respingi', 'reject')

.addToUi();

}



function onSelectionChange(e) {

const range = e.range;

const sheet = range.getSheet();

const maxRows = sheet.getDataRange().getLastRow();

const maxColumns = sheet.getDataRange().getLastColumn();



// Salva la riga selezionata

PropertiesService.getScriptProperties().setProperty("selectedRow", range.getRow());



// Rimuove evidenziazione precedente

sheet.getRange(2, 1, maxRows - 1, maxColumns).setBackground(null);



// Evidenzia la riga selezionata

if (range.getRow() > 1 && range.getRow() <= maxRows) {

sheet.getRange(range.getRow(), 1, 1, maxColumns).setBackground("#FFcc00");

}

}



function authorize() {

try {

const request = getRequest();

if (request) {

sendMail(request, AUTORIZED);

addCalendarEvent(request.name, request.dateFrom, request.dateTo, request.timeFrom, request.timeTo);



const message = `

Data richiesta: ${request.requestDate || "Non disponibile"}

Email: ${request.email || "Non disponibile"}

Nome: ${request.name || "Non disponibile"}

Matricola: ${request.idNumber || "Non disponibile"}

Dal giorno: ${formatDate(request.dateFrom) || "Non disponibile"}

Al giorno: ${formatDate(request.dateTo) || "Non disponibile"}

Dalle ore: ${request.timeFrom || "Non disponibile"}

Alle ore: ${request.timeTo || "Non disponibile"}

`;

SpreadsheetApp.getUi().alert("Dati della Richiesta Autorizzata", message, SpreadsheetApp.getUi().ButtonSet.OK);

}

} catch (error) {

SpreadsheetApp.getUi().alert("Errore", `Si è verificato un errore: ${error.message}`, SpreadsheetApp.getUi().ButtonSet.OK);

}

}


function reject() {

try {

const request = getRequest();

if (request) {

sendMail(request, REJECTED);

}

} catch (error) {

SpreadsheetApp.getUi().alert("Errore", `Si è verificato un errore: ${error.message}`, SpreadsheetApp.getUi().ButtonSet.OK);

}

}

function getRequest() {

const sheet = SpreadsheetApp.getActiveSheet();

const maxColumns = sheet.getDataRange().getLastColumn();

const maxRows = sheet.getDataRange().getLastRow();

const row = parseInt(PropertiesService.getScriptProperties().getProperty("selectedRow"));

if (!row || row == 1 || row > maxRows) {

SpreadsheetApp.getUi().alert("Selezionare una richiesta valida!");

return null;

}


const sel = sheet.getRange(row, 1, 1, maxColumns);

const values = sel.getValues();


const request = {};

request.requestDate = values[0][0];

request.email = values[0][1];

request.name = values[0][2];

request.idNumber = values[0][3];

request.dateFrom = parseDate(values[0][4]);

request.dateTo = parseDate(values[0][5]);

request.timeFrom = parseTime(values[0][8]); // Colonna I

request.timeTo = parseTime(values[0][9]); // Colonna J

return request;

}


function parseDate(dateValue) {

if (dateValue instanceof Date) {

return dateValue;

} else {

throw new Error("Formato data non valido: " + dateValue);

}

}


function parseTime(timeValue) {

if (timeValue instanceof Date) {

const hours = timeValue.getHours().toString().padStart(2, "0");

const minutes = timeValue.getMinutes().toString().padStart(2, "0");

return `${hours}:${minutes}`;

} else if (typeof timeValue === "string") {

const parts = timeValue.split(":");

if (parts.length === 2) {

const hours = parseInt(parts[0], 10).toString().padStart(2, "0");

const minutes = parseInt(parts[1], 10).toString().padStart(2, "0");

return `${hours}:${minutes}`;

}

}

throw new Error("Formato orario non valido: " + timeValue);

}


function addCalendarEvent(title, startDate, endDate, startTime, endTime) {

const startDateTime = new Date(startDate);

const [startHours, startMinutes] = startTime.split(":").map(Number);

startDateTime.setHours(startHours, startMinutes, 0, 0);


const endDateTime = new Date(endDate);

const [endHours, endMinutes] = endTime.split(":").map(Number);

endDateTime.setHours(endHours, endMinutes, 0, 0);



const calendar = CalendarApp.getCalendarById(CALENDAR_ID);

if (!calendar) {

throw new Error("Calendario non trovato: " + CALENDAR_ID);

}

calendar.createEvent(title, startDateTime, endDateTime);

}


function formatDate(date) {

return Utilities.formatDate(date, Session.getScriptTimeZone(), "dd/MM/yyyy");

}


function sendMail(request, result) {

let subject = null;

let body = "Buongiorno " + request.name + " (matricola: " + request.idNumber + "),\n";

body += "La tua richiesta di ferie per il periodo " + formatDate(request.dateFrom) + " - " + formatDate(request.dateTo) + "\n";

body += "Dalle ore " + request.timeFrom + " alle ore " + request.timeTo + "\n";


if (result) {

subject = "Richiesta di ferie accettata";

body += "è stata approvata.";

} else {

subject = "Richiesta di ferie respinta";

body += "è stata respinta. Per delucidazioni contattare la sede. Grazie.";

}

MailApp.sendEmail(request.email, subject, body);

}

N.B. Considerate che non sono un programmatore ed ho scopiazzato ed interpretato quello che altri hanno fatto, ho tagliato e cucito vari pezzi, quindi vi sarei grato se mi indicaste una soluzione alla mia portata. Grazie
 

Discussioni simili