"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Hojas de cálculo de Google: SUMIFS para duraciones (horas), parte 2

Hojas de cálculo de Google: SUMIFS para duraciones (horas), parte 2

Publicado el 2024-11-08
Navegar:832

Google Sheets: SUMIFS para durações (horas), parte 2

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
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
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.

Declaración de liberación Este artículo se reproduce en: https://dev.to/casewinter/google-sheets-sumifs-para-duracoes-horas-parte-2-3bf0?1 Si hay alguna infracción, comuníquese con [email protected] para eliminar él
Último tutorial Más>

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