generate functionTue, 14 Jan 2025

Puedes Analizarme este script, dime si es de JavaScript o le pertenece a otra familia de lenguajes de programación y dime también que debilidades encuentras en este SCRIPT, que puedas mejorarlo. function doGet() { protectSheets(); // Llama a la función para proteger las hojas return HtmlService.createTemplateFromFile('Index') .evaluate() .setTitle('Inicio de sesión - MATRIZ DE DATOS') .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); } function protectSheets() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheets = ss.getSheets(); var exceptSheets = ["SEGUIMIENTO POI 2024", "Users"]; sheets.forEach(function(sheet) { var sheetName = sheet.getName(); // Si la hoja no está en la lista de excepciones if (exceptSheets.indexOf(sheetName) === -1) { var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE); if (protections.length === 0) { var range = sheet.getRange("A:BP"); var protection = range.protect().setDescription('Rango protegido A:BP'); // Elimina todos los editores y solo permite al propietario editar protection.removeEditors(protection.getEditors()); if (protection.canDomainEdit()) { protection.setDomainEdit(false); } } } }); } function validateLogin(form) { var ss = SpreadsheetApp.getActiveSpreadsheet(); if (!hasAccessToFile(form.email)) { Logger.log('Usuario sin acceso al archivo: ' + form.email); return {success: false, error: 'No tienes acceso a este archivo.'}; } var usersSheet = ss.getSheetByName('Users'); var data = usersSheet.getRange('A2:C' + usersSheet.getLastRow()).getValues(); Logger.log('Intento de inicio de sesión - Email: ' + form.email); for (var i = 0; i < data.length; i++) { var email = String(data[i][0] || '').trim(); var password = String(data[i][1] || '').trim(); var sheetName = String(data[i][2] || '').trim(); if (email === form.email.trim() && password === form.password.trim()) { var sheet = ss.getSheetByName(sheetName); if (sheet) { try { sheet.showSheet(); sheet.protect().addEditor(form.email); var url = ss.getUrl() + '#gid=' + sheet.getSheetId(); markUserAsActive(email); Logger.log('Inicio de sesión exitoso. Redirigiendo a: ' + url); // Obtener el mensaje de bienvenida var welcomeInfo = getUserWelcomeMessage(email); return { success: true, url: url, email: email, welcomeName: welcomeInfo.name, welcomeMessage: welcomeInfo.message }; } catch (e) { Logger.log('Error al asignar permisos: ' + e.toString()); return {success: false, error: 'Error al asignar permisos: ' + e.message}; } } else { Logger.log('Hoja no encontrada: ' + sheetName); return {success: false, error: 'Hoja no encontrada: ' + sheetName}; } } } Logger.log('Inicio de sesión fallido. Credenciales no coinciden.'); return {success: false, error: 'Credenciales inválidas'}; } function hasAccessToFile(email) { var file = DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId()); var editors = file.getEditors().map(function(user) { return user.getEmail(); }); var viewers = file.getViewers().map(function(user) { return user.getEmail(); }); var owners = file.getOwner().getEmail(); return editors.concat(viewers).concat(owners).indexOf(email) !== -1; } function markUserAsActive(email) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeUsersSheet = ss.getSheetByName('ActiveUsers'); if (!activeUsersSheet) { activeUsersSheet = ss.insertSheet('ActiveUsers'); activeUsersSheet.getRange('A1:B1').setValues([['Email', 'Sheet']]); } var usersSheet = ss.getSheetByName('Users'); var userData = usersSheet.getRange('A2:C' + usersSheet.getLastRow()).getValues(); var userSheet = ''; for (var i = 0; i < userData.length; i++) { if (userData[i][0] === email) { userSheet = userData[i][2]; break; } } activeUsersSheet.appendRow([email, userSheet]); } function logoutUser(email) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeUsersSheet = ss.getSheetByName('ActiveUsers'); if (activeUsersSheet) { var data = activeUsersSheet.getRange('A2:B' + activeUsersSheet.getLastRow()).getValues(); for (var i = data.length - 1; i >= 0; i--) { if (data[i][0] === email) { activeUsersSheet.deleteRow(i + 2); var userSheet = ss.getSheetByName(data[i][1]); if (userSheet) { userSheet.hideSheet(); } break; } } } } function include(filename) { return HtmlService.createHtmlOutputFromFile(filename) .getContent(); } function onEdit(e) { var sheet = e.source.getActiveSheet(); var sheetName = sheet.getName(); var range = e.range; var oldValue = e.oldValue; var newValue = range.getValue(); var email = e.user ? e.user.getEmail() : Session.getActiveUser().getEmail(); //var email = Session.getActiveUser().getEmail(); // Excluir la hoja consolidada y otras hojas de configuración if (!["SEGUIMIENTO POI 2024", "Users", "ActiveUsers"].includes(sheetName)) { updateConsolidatedSheet(range, sheetName); if (range.getColumn() >= 69 && range.getColumn() <= 371) { // BQ es la columna 69, MS es la columna 371 var backgroundColor = range.getBackground(); if (backgroundColor === '#ffe598' || backgroundColor === '#ffd965') { // Si la celda tiene uno de los colores protegidos, revertir la edición e.range.setValue(e.oldValue); SpreadsheetApp.getUi().alert('Esta celda está protegida y no puede ser editada.'); } } } } function updateConsolidatedSheet(range, sheetName) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var consolidatedSheet = ss.getSheetByName("SEGUIMIENTO POI 2024"); var startRow = range.getRow(); var endRow = startRow + range.getNumRows() - 1; var startCol = range.getColumn(); var endCol = startCol + range.getNumColumns() - 1; var values = range.getValues(); var userColumn = 'MW'; // Columna de usuario var userColIndex = getColumnIndex(userColumn); // Obtener los valores de usuario de las filas editadas var userRange = range.getSheet().getRange(startRow, userColIndex, range.getNumRows(), 1); var userValues = userRange.getValues(); // Crear un mapa de usuarios a filas en la hoja consolidada var consolidatedData = consolidatedSheet.getRange("MW:MW").getValues(); var userRowMap = {}; for (var j = 0; j < consolidatedData.length; j++) { var user = consolidatedData[j][0]; if (user) { userRowMap[user] = j + 1; } } for (var i = 0; i < userValues.length; i++) { var user = userValues[i][0]; var targetRow = userRowMap[user]; if (targetRow) { // Copiar los valores editados a la fila correspondiente en la hoja consolidada var targetRange = consolidatedSheet.getRange(targetRow, startCol, 1, endCol - startCol + 1); targetRange.setValues([values[i]]); } } } function getColumnIndex(columnLetter) { var letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var columnIndex = 0; for (var i = 0; i < columnLetter.length; i++) { columnIndex = columnIndex * 26 + (letters.indexOf(columnLetter[i]) + 1); } return columnIndex; } // Funciones de manejo de sesión function setSession(userEmail) { var cache = CacheService.getUserCache(); cache.put(userEmail, 'active', 30 * 60); // 30 minutos en segundos } function isSessionActive(userEmail) { var cache = CacheService.getUserCache(); var status = cache.get(userEmail); return status == 'active'; } function protectColoredCells() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheets = ss.getSheets(); var exceptSheets = ["SEGUIMIENTO POI 2024", "Users", "ActiveUsers"]; var targetColors = ['#ffe598', '#ffd965']; sheets.forEach(function(sheet) { var sheetName = sheet.getName(); // Si la hoja no está en la lista de excepciones if (!exceptSheets.includes(sheetName)) { var range = sheet.getRange("BQ:MS"); var backgrounds = range.getBackgrounds(); for (var i = 0; i < backgrounds.length; i++) { for (var j = 0; j < backgrounds[i].length; j++) { if (targetColors.includes(backgrounds[i][j].toLowerCase())) { var cell = range.getCell(i + 1, j + 1); var rule = SpreadsheetApp.newDataValidation() .setAllowInvalid(false) .requireFormulaSatisfied('=FALSE') .setHelpText('Esta celda está protegida y no puede ser editada.') .build(); cell.setDataValidation(rule); } } } } }); } function getUserWelcomeMessage(email) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var usersSheet = ss.getSheetByName('Users'); var data = usersSheet.getRange('A2:D' + usersSheet.getLastRow()).getValues(); var welcomeMessage = "Bienvenido a la MATRIZ DE SEGUIMIENTO PLAN\nOPERATIVO INSTITUCIONAL (POI - 2024).\n\nIndicaciones importantes:\n\n💦 Asegúrese de ingresar su información\n en las celdas autorizadas.\n💦 Al terminar de ingresar su información\nNo olvides cerrar Sesión,\nesto permitirá ocultar su hoja de trabajo.\n💦 Si tiene dudas, hemos creado un Video\ninstructivo que se encuentra al\ncostado de los icono de navegadores 🎥\n (Al cerrar el video, Pausa primero y luego cierras\n para que el audio no se siga reproduciendo). \n💦 Cualquier duda adicional, por favor\ncontactarte con la Oficina de\nPlaneamiento y Modernización - Diris Lima Este."; for (var i = 0; i < data.length; i++) { if (data[i][0] === email) { var userName = email.split('@')[0]; // Obtiene el nombre de usuario del correo return {name: userName, message: welcomeMessage}; } } return {name: "Usuario", message: welcomeMessage}; } // nueva implementación function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Panel de Control') .addItem('Mostrar Panel', 'showControlPanel') .addToUi(); } function showControlPanel() { var html = HtmlService.createHtmlOutputFromFile('ControlPanel') .setWidth(900) .setHeight(80); SpreadsheetApp.getUi().showModalDialog(html, 'Panel de Control'); } function hideColumns(startCol, endCol) { var sheet = SpreadsheetApp.getActiveSheet(); var startIndex = columnToIndex(startCol); var endIndex = columnToIndex(endCol); sheet.hideColumns(startIndex, endIndex - startIndex + 1); } function showColumns(startCol, endCol) { var sheet = SpreadsheetApp.getActiveSheet(); var startIndex = columnToIndex(startCol); var endIndex = columnToIndex(endCol); sheet.showColumns(startIndex, endIndex - startIndex + 1); } function freezeColumns(column) { var sheet = SpreadsheetApp.getActiveSheet(); sheet.setFrozenColumns(columnToIndex(column)); } function unfreezeColumns() { var sheet = SpreadsheetApp.getActiveSheet(); sheet.setFrozenColumns(0); // Esto desinmoviliza todas las columnas } function jumpToColumn(column) { var sheet = SpreadsheetApp.getActiveSheet(); sheet.setActiveRange(sheet.getRange(column + "1")); } function columnToIndex(column) { return column.split('').reduce((prev, curr) => prev * 26 + curr.charCodeAt(0) - 'A'.charCodeAt(0) + 1, 0); } function getColumnName(index) { var temp, letter = ''; while (index > 0) { temp = (index - 1) % 26; letter = String.fromCharCode(temp + 65) + letter; index = (index - temp - 1) / 26; } return letter; } function getLastColumn() { var sheet = SpreadsheetApp.getActiveSheet(); return getColumnName(sheet.getLastColumn()); }

Please keep input under 1000 characters

Javascript
Generate More

Want to kickstart your project?Use the new AI Studio to create your code