Carlos Roberto Martinez Andrade

All generations.

generate functionTue, 14 Jan 2025

dame un ejemplo de JavaScript APPSSCRIPT TYPESCRIPT quiero ver las diferencias

Aquí te muestro un ejemplo de cómo se podría implementar una función que calcula el área de un triángulo en cada uno de los lenguajes que mencionaste: **JavaScript** ```javascript // Función que calcula el área de un triángulo function calcularAreaTriangulo(base, altura) { return (base * altura) / 2; } // Uso de la función const base = 5; const altura = 10; const area = calcularAreaTriangulo(base, altura); console.log(`El área del triángulo es: ${area}`); ``` **APPSSCRIPT (Nota: AppScript es un lenguaje de programación basado en JavaScript, utilizado para desarrollar aplicaciones de Google Apps Script)** ```appscript // Función que calcula el área de un triángulo function calcularAreaTriangulo(base, altura) { return (base * altura) / 2; } // Uso de la función var base = 5; var altura = 10; var area = calcularAreaTriangulo(base, altura); Logger.log('El área del triángulo es: ' + area); ``` **TYPESCRIPT** ```typescript // Definición de la función que calcula el área de un triángulo function calcularAreaTriangulo(base: number, altura: number): number { return (base * altura) / 2; } // Uso de la función const base: number = 5; const altura: number = 10; const area: number = calcularAreaTriangulo(base, altura); console.log(`El área del triángulo es: ${area}`); ``` **Diferencias** * **Tipado**: TypeScript es un lenguaje de programación tipado, lo que significa que debes declarar el tipo de cada variable y función. En JavaScript y AppScript, no hay tipado explícito. * **Sintaxis**: La sintaxis de TypeScript es similar a la de JavaScript, pero con algunas diferencias en la forma de declarar variables y funciones. * **Funcionalidades**: TypeScript ofrece algunas funcionalidades adicionales, como la capacidad de crear interfaces y clases, que no están disponibles en JavaScript y AppScript. * **Compatibilidad**: AppScript es un lenguaje de programación basado en JavaScript, por lo que es compatible con la mayoría de las bibliotecas y frameworks de JavaScript. TypeScript, por otro lado, es un lenguaje de programación que se compila a JavaScript, por lo que es compatible con la mayoría de las bibliotecas y frameworks de JavaScript. En resumen, si estás desarrollando una aplicación de Google Apps Script, AppScript es el lenguaje de programación más adecuado. Si estás desarrollando una aplicación más compleja que requiere tipado y funcionalidades adicionales, TypeScript puede ser una buena opción. Si estás desarrollando una aplicación web o móvil, JavaScript es el lenguaje de programación más adecuado.

Javascript
View
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
View

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