DanielaMartinezD / Estudio-Js

0 stars 0 forks source link

Estudio JS #1

Open DanielaMartinezD opened 4 months ago

DanielaMartinezD commented 4 months ago

Tarea 2 Para generar una pestaña (expansión) en la barra de sheets, en la cual se llamarán las funciones. function onOpen() { const ui = SpreadsheetApp.getUi();

ui.createMenu('Nuevas Funciones') .addItem('Verificar promedios', 'validateAverage') //esta. lo que viene dsp de la coma es la funcion i guess .addItem('Próximo bloque', 'nextBlock') .addItem('Generar resumen', 'summary') //esta .addItem('Generar resumen profesores', 'teachersSummary') .addItem('Análisis módulos', 'moduleAnalysis') .addItem('Gráficos', 'graphs') //esta .addToUi(); }

Primera sección de graphs donde se realiza lo necesario para el histograma (main) function graphs(){ const ss = SpreadsheetApp.getActiveSpreadsheet(); const newSheet = createSheet(ss, "Gráficos"); // Crea nueva hoja const sheets = getGradesSheets();// Retorna todas las hojas Bi const categories = []; getFirstSheetValues(ss).forEach((subList,idx) => { if(idx > 0){ Logger.log(subList[0]); return categories.push(subList[0].toString()); } }) categories.push("APR"); const gradesList = []; sheets.forEach(function extractInfo(sheetName) { const sheet = ss.getSheetByName(sheetName); const columnData = getColumn(sheet, getHeaders(sheet), "Nota Final"); gradesList.push(columnData); }); const grades = allGrades(gradesList); const filteredGrades = []; grades.map(subList => { if(Array.isArray(subList) && subList.length > 1) { let badGradesAmount = subList.filter(grade => parseFloat(grade) < parseFloat(3.95)).length; if(badGradesAmount >= 2){ filteredGrades.push(pass(subList.map(stud => [parseFloat(pass(stud))]))); //Todos los datos ya filtrados } else{ subList.filter(grade => parseFloat(grade) >= parseFloat(3.95)); filteredGrades.push(pass(subList.map(stud => [parseFloat(pass(stud))]))); //Todos los datos ya filtrados }} else{ filteredGrades.push(subList); } }); const filteredGradesToList = filteredGrades.map(grade => [parseFloat(grade)]); const hRange = histogramRange(filteredGradesToList,newSheet); createHistogram(hRange,newSheet);

Rango especializado para los datos del histograma (readSheets) function histogramRange(filteredGradesToList,newSheet){ const dataNewSheet = newSheet.getRange(1, 1, filteredGradesToList.length, 1); dataNewSheet.setValues(filteredGradesToList); dataNewSheet.setFontColor("white"); //Esconde la data; const data = newSheet.getRange(1, 1, newSheet.getLastRow() - 1); return data; }

Crear el gráfico insertándolo en la hoja (writeSheets) function createHistogram(data, newSheet){ let chart = newSheet.newChart() .setChartType(Charts.ChartType.HISTOGRAM)
.addRange(data) .setOption('title', 'Histograma de Notas finales ') .setOption('hAxis', {title: 'Notas', minValue: 1, maxValue: 20}) //ejeX .setOption('vAxis', {title: 'Frecuencia'}) //ejeY .setOption('colors', ['#EB9605']) //color naranjo .setPosition(5, 5, 0, 0) // Ajusta la posición del gráfico en la hoja .build(); // Insertar el gráfico en la hoja newSheet.insertChart(chart); }

Funciones creadas en la tarea: readSheets: //Retorna la posición de 1 header function getSpecificHeaderPosition(sheet, header){ return sheet.getDataRange() .getValues()[0] // [0] porque los headers están en primera fila .indexOf(header); }

//Retorna la posición de LOS headers necesarios function getHeadersPosition(sheet, headers){ const headersPosition = headers.map(actualHeader => sheet.getDataRange() .getValues()[0] // [0] headers primera fila .indexOf(actualHeader)); //retorna índice return headersPosition; }

//Consigue valores de una columna en específico function getColumn(sheet, headers, specificHeader){ const idxSpecificHeader = headers.indexOf(specificHeader) + 1; return sheet.getRange(2,idxSpecificHeader,sheet.getLastRow()-1).getValues() }

// Retorna todas las hojas Bi function getGradesSheets(){ const ss = SpreadsheetApp.getActiveSpreadsheet(); const allSheets = ss.getSheets(); const sheets = allSheets.filter(sheet => sheet.getName() .startsWith('B')) .map(sheet => sheet.getName()) .sort(); return sheets;} writeSheets: function createSheet(ss, sheetName){ // Comprueba si la hoja ya existe, retorna true o false const existingSheet = ss.getSheetByName(sheetName); if (existingSheet) { ss.deleteSheet(existingSheet); } const sheetNum = ss.getNumSheets(); ss.insertSheet(sheetName, sheetNum); const ss1 = SpreadsheetApp.getActiveSpreadsheet() return ss1.getSheetByName(sheetName); }

function changeColor(daSheet){ const headers = getHeaders(daSheet); const finalG = []; headers.map((head,idx) => head == "Nota Final" ? finalG.push(idx + 1) : null); const allGradesData = []; finalG.map(position => allGradesData.push(daSheet.getRange(2, position, daSheet.getLastRow() - 1).getValues())); const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheets = getGradesSheets(); const recuperativeList = []; sheets.forEach(function extractInfo(sheetName) { try{ const sheet = ss.getSheetByName(sheetName); const sheetValues = sheet.getDataRange().getValues(); const idxRecupertive = sheetValues[0].indexOf("Aprueba Recuperativo"); const columnData = sheet.getRange(2, idxRecupertive + 1, sheet.getLastRow() - 1).getValues(); recuperativeList.push(columnData); } catch(error){ } }); recuperativeList.map((sublist,idx) => { sublist.map((yesNo,idx2) => {if(yesNo == "Sí"){ const cell = daSheet.getRange(idx2+2, finalG[idx]); cell.setBackground("#FFEE58"); } else if(yesNo == "No"){ if(parseFloat(allGradesData[idx][idx2]) <= parseFloat(3.95)){ const cell = daSheet.getRange(idx2+2, finalG[idx]); cell.setBackground("#FF7F7F");

};

} }) }); const finalFinalAverage = daSheet.getRange(2, headers.indexOf("Notas Finales Promediadas")+1, daSheet.getLastRow() - 1).getValues(); const yesNoList = allGrades(recuperativeList); yesNoList.map((sublist,idx) => { const noAmount = sublist.filter(yesNo => yesNo == "No").length; if(noAmount >= 2){ if( parseFloat(finalFinalAverage[idx]) < parseFloat(3.95)){ const cell = daSheet.getRange(idx+2, headers.indexOf("Notas Finales Promediadas")+1); cell.setBackground("#FF7F7F");}} }); }

function insertHeaders(sheet, header){ try{ try{ const actualHeaders = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; header.forEach((actual,idx) => sheet.getRange(1, idx+(actualHeaders.length)+1).setValue(actual)); } catch (error){ header.forEach((actual,idx) => { sheet.getRange(1, idx+1).setValue(actual); } ); //Primer encabezado XD } } catch (error){ try{ const actualHeaders = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; sheet.getRange(1, actualHeaders+1).setValue(header); } catch (error){ sheet.getRange('A1').setValue(header); //Primer encabezado XD }} }

Ejemplos Clase Ejemplos Composición //Generado array con números de x a y const range = (x,y)=> x>y?[]:[x,... range(x +1,y)];

//Multiplica los valores de un array const multiply = arr => arr.reduce((p,a)=> p*a,1);

//Composición->Factorial const factorial = n => multiply (range(1,n)); console.log(factorial(5));

Funciones array •array.filter(fn)→ crea una copia del array con los elementos que pasan el filtro (retorna true) dado por la función que recibe como parámetro.

•array.map(fn)→crea un nuevo array con el resultado de llamar a la función recibida para cada elemento del array original (el resultado es del mismo largo).

•array.reduce(fn)→reduce el array a un solo valor, llamando a la función recibida para cada elemento del array con el resultado dado por el elemento anterior. Puede recibir un segundo argumento de valor inicial.

•array.concat(a1, a2, ...)→permite unir dos o más array generando un array nuevo (no modifica los array que utiliza).

•array.forEach(fn)→ejecuta la función recibida una vez por cada elemento del array

Ejemplo funciones array Función que recibe una lista de strings, retornando el string más largo:

function longestWord( list ) { return list . reduce (( lt , x ) = > lt . length > x . length ? lt : x ," " ); }

Función que recibe una lista, y dos funciones, ejecutando la primera función en cada elemento de la lista que retorna verdadero ante la llamada a la segunda función:

function rare ( list , fn1 , fn2 ) { return list . filter ( x = > fn2 ( x )). forEach ( x = > fn1 ( x )); }

Ejercicio ingresos totales por prenda const sales = [ { product : " Camiseta " , quantity : 150 , unitPrice : 25 } , { product : " Pantalón " , quantity : 90 , unitPrice : 45 } , { product : " Zapatos " , quantity : 200 , unitPrice : 90 } , { product : " Sombrero " , quantity : 50 , unitPrice : 15 } , { product : " Bufanda " , quantity : 120 , unitPrice : 18 } ]; function calculateTotalSales ( sales , threshold ) { return sales . filter ( s = > s . quantity > threshold ) . map ( s = > s . quantity * s . unitPrice ) . reduce (( total , s ) = > total + s , 0); }

Asignar objeto a uno nuevo sin cambiar el original function object(){ const ob1 = {'ana':21} const ob2 = Object.assign({}, ob1, {['pedro'] : 20})

Escribe una función que convierte una función de dos argumentos en una función que puede ser llamada con un argumento a la vez function curry(f) { return function(a) { return function(b) { return f(a, b); }; }; } function add(a, b) { return a + b; } var curriedAdd = curry(add); // Prueba la función Logger.log(curriedAdd(2)(3)); // 5

DanielaMartinezD commented 4 months ago

function person(){ const people = [ { name : "ana" , age : 15 , pc : 25 } , { name : "santi" , age : 9 , pc : 45 } , { name : "feña" , age : 20 , pc : 90 } , { name : "kifer" , age : 50 , pc : 15 } , { name : "pavez" , age : 12 , pc : 18 } ]; const lst = [] people.forEach(dic=> dic.age >18 ? lst.push(dic.name): ""); Logger.log(lst) }