"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 > ¿Cómo agregar horas en Google Sheets usando criterios para filtrar filas?

¿Cómo agregar horas en Google Sheets usando criterios para filtrar filas?

Publicado el 2024-08-22
Navegar:682

¡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?

Crear datos genéricos para pruebas.

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

Guion

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);
}

¿Cómo utilizar?

Los criterios pueden ser texto o números, pero los tiempos deben tener el formato “Texto sin formato”.

Como somar horas no Google Sheets usando critérios para filtrar linhas?

Ir a la aplicación de script:

Como somar horas no Google Sheets usando critérios para filtrar linhas?

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:

Como somar horas no Google Sheets usando critérios para filtrar linhas?

Fue solo un tip, espero que les haya gustado, y si tienen sugerencias déjenlas en el comentario. Abrazos.

Declaración de liberación Este artículo se reproduce en: https://dev.to/casewinter/como-somar-horas-no-google-sheets-usando-criterios-para-filtrar-linhas-364p?1 Si hay alguna infracción, comuníquese con Study_golang @163.com eliminar
Ú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