¡Hola, chicos! Hoy quiero compartir un script súper útil que creé para resolver un problema cotidiano común.
Si alguna vez intentó agregar "duración" en Google Sheets, es posible que haya notado que las fórmulas SUMIF y SUMIFS no funcionan para agregar duraciones de eventos o productos según criterios específicos. Esto puede ser un obstáculo dependiendo del tipo de cálculo que necesites hacer. ¡Pero no te preocupes! Google Sheets te permite crear secuencias de comandos JavaScript y utilizarlas como fórmulas personalizadas.
En mi guión, creé dos variaciones: la primera acepta un criterio y la segunda hasta dos. Planeo mejorar esto en el futuro para que la función sea aún más flexible.
Vale la pena recordar que las fórmulas personalizadas no devuelven valores directamente computables por el programa. Para solucionar esto, puede ajustar el resultado con la función =VALUE(). Luego, simplemente aplique el formato correspondiente al tipo de datos (en nuestro caso, "duración"). ¿Listo para ver el guión?
En primer lugar, generemos datos para probar la fórmula. Utilicé nuestro amigo GPT para esto.
Título | Duración | Categoría | Estado |
---|---|---|---|
El marciano | 01:00:00 | Película | Ya lo he visto |
Interestelar | 02:49:00 | Película | Ya lo he visto |
John Wick | 01:30:00 | Película | Ya lo he visto |
Vengadores: Endgame | 03:00:00 | Película | Quiero ver |
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 |
La casa de papel | 00:55:00 | Serie | Quiero ver |
Game of Thrones | 01:10:00 | Serie | Quiero ver |
Traté de documentar todo lo mejor posible. Decidí separarlo en funciones más pequeñas y usar algo más declarativo para aumentar la claridad del código.
function todosSaoArrays(...arrays) { return arrays.every(Array.isArray); } function todosArraysTemOMesmoTamanho(...arrays) { const lengths = arrays.map((arr) => arr.length); return lengths.every((val) => val === lengths[0]); } function converterHMSParaSegundos(hms) { // Quebra a string do formato HH:MM:SS em partes const partes = String(hms).split(":"); // Converte as partes em números inteiros const [horas, minutos, segundos] = partes; // Converte horas e minutos para segundos e soma com os segundos const totalSegundos = Number(horas) * 3600 Number(minutos) * 60 Number(segundos); return Number(totalSegundos); } function converterSegundosParaHMS(segundos) { // Calcula o número de horas, minutos e segundos const horas = Math.floor(segundos / 3600); const minutos = Math.floor((segundos % 3600) / 60); const segundosRestantes = segundos % 60; // Adiciona zero à esquerda para garantir que tenha sempre dois dígitos const formatoHoras = String(horas).padStart(2, "0"); const formatoMinutos = String(minutos).padStart(2, "0"); const formatoSegundos = String(segundosRestantes).padStart(2, "0"); // Retorna o formato HH:MM:SS return `${formatoHoras}:${formatoMinutos}:${formatoSegundos}`; } /** * Soma as horas baseado um critério. * * @param {string[]} intervalo_soma - Conjunto de intervalos de tempo em formato HH:MM:SS. * @param {number[]} intervalo_de_criterios - Conjunto de critérios correspondentes aos intervalos de tempo. * @param {number} criterio - O critério para o qual as horas devem ser somadas. * @returns {string} Soma das durações passadas, ou uma mensagem de erro. */ function somarHorasSe(intervalo_soma, intervalo_de_criterios, criterio) { if (!todosSaoArrays(intervalo_soma, intervalo_de_criterios)) return "Passe os intervalos para o calculo!"; if (!todosArraysTemOMesmoTamanho(intervalo_soma, intervalo_de_criterios)) return "Os intervalos devem ter o mesmo tamanho"; // Filtra os intervalos de tempo para o critério específico const horasParaSomar = intervalo_soma.filter( (linha, index) => String(intervalo_de_criterios[index]).trim() == String(criterio).trim() ); // Converte as horas filtradas para segundos const horasEmSegundos = horasParaSomar.map((n) => converterHMSParaSegundos(n) ); // Soma todos os segundos const somaDosSegundos = horasEmSegundos.reduce((acumulador, valorAtual) => { return acumulador valorAtual; }, 0); // Converte o total de segundos de volta para o formato HH:MM:SS return converterSegundosParaHMS(somaDosSegundos); } /** * Soma as horas baseado em critérios. * * @param {string[]} intervalo_soma - Conjunto de intervalos de tempo em formato HH:MM:SS. * @param {number[]} intervalo_de_criterios1 - Primeiro conjunto de critérios correspondentes aos intervalos de tempo. * @param {number} criterio1 - O primeiro critério para o qual as horas devem ser somadas. * @param {string[]} intervalo_de_criterios2 - Segundo conjunto de critérios correspondentes aos intervalos de tempo. * @param {string} semestre - O segundo critério para o qual as horas devem ser somadas. * @returns {string} Soma das durações passadas, ou uma mensagem de erro. */ function somarHorasSe2( intervalo_soma, intervalo_de_criterios1, criterio1, intervalo_de_criterios2, criterio2 ) { if ( !todosSaoArrays( intervalo_soma, intervalo_de_criterios1, intervalo_de_criterios2 ) ) return "Passe os intervalos para o calculo!"; if ( !todosArraysTemOMesmoTamanho( intervalo_soma, intervalo_de_criterios1, intervalo_de_criterios2 ) ) return "Os intervalos devem ter o mesmo tamanho"; // Filtra os intervalos de tempo para os critérios passados const horasParaSomar = intervalo_soma.filter( (linha, index) => String(intervalo_de_criterios1[index]) == String(criterio1).trim() && String(intervalo_de_criterios2[index]).trim() === String(criterio2).trim() ); // Converte as horas filtradas para segundos const horasEmSegundos = horasParaSomar.map((n) => converterHMSParaSegundos(n) ); // Soma todos os segundos const somaDosSegundos = horasEmSegundos.reduce((acumulador, valorAtual) => { return acumulador valorAtual; }, 0); // Converte o total de segundos de volta para o formato HH:MM:SS return converterSegundosParaHMS(somaDosSegundos); }
Los criterios pueden ser texto o números, pero los tiempos deben tener el formato “Texto sin formato”.
Ir a la aplicación de script:
Pegue el script y "CTRL S". Listo. Para utilizarlo es el mismo proceso que una fórmula nativa.
Una vez aplicada la fórmula, podemos volver a tratarla como un tipo que el programa entiende usando VALOR, su código debería verse así:
=VALUE(somarHorasSe2($C$2:$C$11;$D$2:$D$11;C$14;$E$2:$E$11;$B15))
Si todo salió bien, este debería ser tu resultado:
Fue solo un tip, espero que les haya gustado, y si tienen sugerencias déjenlas en el comentario. 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