Registro/Login
el excel al que llegan los datos es: https://docs.google.com/spreadsheets/d/1StJHOMGeF7duq7fm3k2aq6vKZxTBQ_1aC6_RGlKJbVE/edit?gid=0#gid=0 

 y el codigo de app script es: const SPREADSHEET_ID = "1StJHOMGeF7duq7fm3k2aq6vKZxTBQ_1aC6_RGlKJbVE"; // ID de tu Google Sheets const SHEET_NAME = "Usuarios"; const COLS = { nombre: 1, telefono: 2, correo: 3, contrasena: 4, direccion: 5, barrio: 6, ciudad: 7, departamento: 8, pais: 9, codigo_postal: 10 }; // Punto de entrada que maneja POST function doPost(e) { try { const ss = SpreadsheetApp.openById(SPREADSHEET_ID); const sheet = ss.getSheetByName(SHEET_NAME); const data = e.parameter || {}; const accion = data.accion; if (!accion) { return respuestaJSON(false, "No se indicó la acción"); } if (accion === "registro") { return registrarUsuario(sheet, data); } else if (accion === "login") { return loginUsuario(sheet, data); } else if (accion === "actualizar") { return actualizarUsuario(sheet, data); } else if (accion === "recuperar") { return recuperarContrasena(sheet, data); } else { return respuestaJSON(false, "Acción desconocida"); } } catch (error) { return respuestaJSON(false, "Error: " + error.message); } } function hashPassword(password) { const rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, password); return rawHash.map(b => ("0" + (b & 0xFF).toString(16)).slice(-2)).join(""); } // Optimizado: busca solo en la columna correo, luego obtiene la fila completa function buscarUsuario(sheet, correo) { const lastRow = sheet.getLastRow(); if (lastRow < 2) return null; // No hay datos const correos = sheet.getRange(2, COLS.correo, lastRow - 1, 1).getValues(); for (let i = 0; i < correos.length; i++) { if (correos[i][0].toString().toLowerCase() === correo.toLowerCase()) { const fila = i + 2; const datos = sheet.getRange(fila, 1, 1, sheet.getLastColumn()).getValues()[0]; return { fila, datos }; } } return null; } function registrarUsuario(sheet, data) { const camposRequeridos = ["nombre", "telefono", "correo", "contrasena", "direccion", "barrio", "ciudad", "departamento", "pais", "codigo_postal"]; for (const campo of camposRequeridos) { if (!data[campo]) { return respuestaJSON(false, `Falta el campo obligatorio: ${campo}`); } } if (buscarUsuario(sheet, data.correo)) { return respuestaJSON(false, "Ya existe un usuario registrado con ese correo"); } const contrasenaHash = hashPassword(data.contrasena); const nuevaFila = [ data.nombre, data.telefono, data.correo.toLowerCase(), contrasenaHash, data.direccion, data.barrio, data.ciudad, data.departamento, data.pais, data.codigo_postal ]; sheet.appendRow(nuevaFila); return respuestaJSON(true, "Registro exitoso"); } function loginUsuario(sheet, data) { if (!data.correo || !data.contrasena) { return respuestaJSON(false, "Correo y contraseña son requeridos"); } const usuario = buscarUsuario(sheet, data.correo); if (!usuario) { return respuestaJSON(false, "Usuario no encontrado"); } const hashInput = hashPassword(data.contrasena); if (usuario.datos[COLS.contrasena - 1] !== hashInput) { return respuestaJSON(false, "Contraseña incorrecta"); } const datosUsuario = { nombre: usuario.datos[COLS.nombre - 1], telefono: usuario.datos[COLS.telefono - 1], correo: usuario.datos[COLS.correo - 1], direccion: usuario.datos[COLS.direccion - 1], barrio: usuario.datos[COLS.barrio - 1], ciudad: usuario.datos[COLS.ciudad - 1], departamento: usuario.datos[COLS.departamento - 1], pais: usuario.datos[COLS.pais - 1], codigo_postal: usuario.datos[COLS.codigo_postal - 1] }; return ContentService.createTextOutput(JSON.stringify({ success: true, message: "Login exitoso", datos: datosUsuario })).setMimeType(ContentService.MimeType.JSON); } function actualizarUsuario(sheet, data) { if (!data.correo) { return respuestaJSON(false, "Correo es obligatorio para actualizar"); } const usuario = buscarUsuario(sheet, data.correo); if (!usuario) { return respuestaJSON(false, "Usuario no encontrado"); } const fila = usuario.fila; let contrasenaHash = usuario.datos[COLS.contrasena - 1]; if (data.contrasena && data.contrasena.trim() !== "") { contrasenaHash = hashPassword(data.contrasena); } const nuevosDatos = [ data.nombre || usuario.datos[COLS.nombre - 1], data.telefono || usuario.datos[COLS.telefono - 1], usuario.datos[COLS.correo - 1], contrasenaHash, data.direccion || usuario.datos[COLS.direccion - 1], data.barrio || usuario.datos[COLS.barrio - 1], data.ciudad || usuario.datos[COLS.ciudad - 1], data.departamento || usuario.datos[COLS.departamento - 1], data.pais || usuario.datos[COLS.pais - 1], data.codigo_postal || usuario.datos[COLS.codigo_postal - 1] ]; sheet.getRange(fila, 1, 1, nuevosDatos.length).setValues([nuevosDatos]); const datosActualizados = { nombre: nuevosDatos[COLS.nombre - 1], telefono: nuevosDatos[COLS.telefono - 1], correo: nuevosDatos[COLS.correo - 1], direccion: nuevosDatos[COLS.direccion - 1], barrio: nuevosDatos[COLS.barrio - 1], ciudad: nuevosDatos[COLS.ciudad - 1], departamento: nuevosDatos[COLS.departamento - 1], pais: nuevosDatos[COLS.pais - 1], codigo_postal: nuevosDatos[COLS.codigo_postal - 1] }; return respuestaJSON(true, "Perfil actualizado con éxito", datosActualizados); } function recuperarContrasena(sheet, data) { const correo = data.correo; if (!correo) { return respuestaJSON(false, "El correo es obligatorio"); } const usuario = buscarUsuario(sheet, correo); if (!usuario) { return respuestaJSON(false, "No existe un usuario con ese correo"); } // Generar nueva contraseña aleatoria const nuevaContrasena = Math.random().toString(36).slice(-8); // 8 caracteres const hashNueva = hashPassword(nuevaContrasena); // Actualizar la contraseña en la hoja const fila = usuario.fila; sheet.getRange(fila, COLS.contrasena).setValue(hashNueva); const nombreSitio = data.nombre_sitio || "Tu sitio web"; const emailBody = ` Hola ${usuario.datos[COLS.nombre - 1]}, Has solicitado recuperar tu contraseña en "${nombreSitio}". Tu nueva contraseña temporal es: ${nuevaContrasena} Por favor, inicia sesión y cambia tu contraseña desde tu perfil. ¡Saludos! `; MailApp.sendEmail({ to: correo, subject: `Recuperación de contraseña - ${nombreSitio}`, body: emailBody }); return respuestaJSON(true, "Se ha enviado una nueva contraseña a tu correo."); } function respuestaJSON(success, message, datos = null) { const salida = { success: success, message: message }; if (datos) salida.datos = datos; return ContentService .createTextOutput(JSON.stringify(salida)) .setMimeType(ContentService.MimeType.JSON); }

No hay comentarios: