El otro día hice un post mostrando cómo crear dos fórmulas personalizadas para hojas de Google para añadir horas según criterios (aquí). Su problema, en mi opinión, es que no fueron flexibles. ¿Qué pasa si quiero N criterios? ¡Pues ahora puedes!
Ahora la fórmula toma 3 conjuntos de datos: las duraciones, los criterios y las instrucciones de filtrado. Volvamos a la hoja de cálculo de prueba:
Título | Duración | Categoría | Estado | Como |
---|---|---|---|---|
El marciano | 01:00:00 | Película | Ya lo he visto | Sí |
Interestelar | 02:49:00 | Película | Ya lo he visto | No |
John Wick | 01:30:00 | Película | Ya lo he visto | No |
Vengadores: Endgame | 03:00:00 | Película | Quiero mirar | |
Cosas más extrañas | 00:45:00 | Serie | Asistiendo | |
El Brujo | 01:00:01 | Serie | Asistiendo | |
El mandaloriano | 00:40:00 | Serie | Asistiendo | |
Breaking Bad | 00:50:00 | Serie | Ya lo he visto | Sí |
La casa de papel | 00:55:00 | Serie | Quiero mirar | |
Game of Thrones | 01:10:00 | Serie | Quiero mirar |
Actualicemos el script de nuestra aplicación, sugiero crear otra hoja de cálculo de prueba y comenzar una nueva, recordando que las horas deben estar en “texto sin formato”. El código está aquí:
/** * Converte uma string no formato HH:MM:SS para o total em segundos. * * @param {string} hms - A string no formato HH:MM:SS. * @returns {number} O total em segundos. */ function converterHMSParaSegundos(hms) { const partes = String(hms).split(":"); const [horas, minutos, segundos] = partes; return Number(horas) * 3600 Number(minutos) * 60 Number(segundos); } /** * Converte um número de segundos para o formato HH:MM:SS. * * @param {number} segundos - O total de segundos. * @returns {string} O tempo no formato HH:MM:SS. */ function converterSegundosParaHMS(segundos) { const horas = Math.floor(segundos / 3600); const minutos = Math.floor((segundos % 3600) / 60); const segundosRestantes = segundos % 60; return `${String(horas).padStart(2, "0")}:${String(minutos).padStart( 2, "0" )}:${String(segundosRestantes).padStart(2, "0")}`; } /** * Filtra as linhas da matriz de dados com base nos critérios fornecidos e retorna as durações correspondentes. * * @param {Array} duracoes - Array de durações em formato de texto. * @param {Array >} dados - Matriz de dados onde cada linha corresponde a um conjunto de valores. * @param {Array } criterios - Array de critérios para filtrar as linhas da matriz de dados. * @returns {Array } Retorna as durações que correspondem aos critérios. */ function filtroDeLinhas(duracoes, dados, criterios) { const linhas_na_matriz = duracoes.length; const matriz_de_criterios_concatenada = []; for (let linha = 0; linha } duracoes - Array de durações em formato de texto. * @param {Array >} intervalo_de_criterios - Matriz de dados onde cada linha corresponde a um conjunto de valores. * @param {...string} criterios - Um ou mais critérios para filtrar as linhas da matriz de dados. * @returns {string} A soma das durações no formato HH:MM:SS. */ function somarHorasComCriterios( duracoes, intervalo_de_criterios, ...criterios ) { // Verifica se todos os argumentos são arrays if ( !Array.isArray(duracoes) || !Array.isArray(intervalo_de_criterios) || !Array.isArray(criterios) ) { return "Passe os intervalos para o cálculo!"; } const horasParaSomar = filtroDeLinhas( duracoes, intervalo_de_criterios, criterios.flat(Infinity) ); const horasEmSegundos = horasParaSomar.map((n) => converterHMSParaSegundos(n) ); const somaDosSegundos = horasEmSegundos.reduce( (acumulador, valorAtual) => acumulador valorAtual, 0 ); return converterSegundosParaHMS(somaDosSegundos); }
Digamos que paso:
Película | Ya lo he visto | No
Mi suma sería: 04:19:00
¡Y recuerde que puedo ajustar esto con la función nativa: =VALOR y formatearlo como “duración” y las hojas vuelven a las sumas de trabajo como si usaran una fórmula nativa!
Como dije en el último post, cualquier sugerencia o duda dejad vuestros comentarios. Abrazos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3