"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Planilhas Google: como construir um SUMIFS por horas

Planilhas Google: como construir um SUMIFS por horas

Publicado em 2024-11-08
Navegar:225

Google Sheets: How to Build a SUMIFS for Hours

Olá pessoal! Hoje quero compartilhar um script super útil que criei para resolver um problema comum do dia a dia.

Se você já tentou somar a "duração" no Planilhas Google, deve ter notado que as fórmulas SUMIF e SUMIFS não funcionam para somar durações de eventos ou produtos com base em critérios específicos. Isso pode ser um obstáculo dependendo do tipo de cálculo que você precisa fazer. Mas não se preocupe! O Planilhas Google permite criar scripts em JavaScript e usá-los como fórmulas personalizadas.

No meu script, criei duas variações: a primeira aceita um critério e a segunda aceita até dois. Estou planejando melhorar isso no futuro para tornar a função ainda mais flexível.

Vale ressaltar que fórmulas customizadas não retornam valores diretamente computáveis ​​pelo programa. Para contornar isso, você pode agrupar o resultado com a função =VALUE(). Depois, basta aplicar a formatação correspondente ao tipo de dados – no nosso caso, “duração”. Pronto para conferir o roteiro?

Criando dados genéricos para teste

Em primeiro lugar, vamos gerar dados para testar a fórmula. Usei nosso amigo GPT para isso.

Título Duração Categoria Status
O Marciano 01:00:00 Filme Assistido
Interestelar 02:49:00 Filme Assistido
John Wick 01:30:00 Filme Assistido
Vingadores: Ultimato 03:00:00 Filme Quero assistir
Coisas estranhas 00:45:00 Série Assistindo
O Bruxo 01:00:01 Série Assistindo
O Mandaloriano 00:40:00 Série Assistindo
Liberando o mal 00:50:00 Série Assistido
Assalto a dinheiro 00:55:00 Série Quero assistir
Guerra dos Tronos 01:10:00 Série Quero assistir

Roteiro

Tentei documentar tudo da melhor maneira possível. Decidi dividi-lo em funções menores e usar algo mais declarativo para aumentar a clareza do código.

function allAreArrays(...arrays) {
  return arrays.every(Array.isArray);
}

function allArraysHaveSameLength(...arrays) {
  const lengths = arrays.map((arr) => arr.length);
  return lengths.every((val) => val === lengths[0]);
}

function convertHMSToSeconds(hms) {
  // Breaks the string in HH:MM:SS format into parts
  const parts = String(hms).split(":");

  // Converts the parts into integers
  const [hours, minutes, seconds] = parts;

  // Converts hours and minutes into seconds and adds the seconds
  const totalSeconds =
    Number(hours) * 3600   Number(minutes) * 60   Number(seconds);

  return Number(totalSeconds);
}

function convertSecondsToHMS(seconds) {
  // Calculates the number of hours, minutes, and seconds
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const remainingSeconds = seconds % 60;

  // Adds a leading zero to ensure it always has two digits
  const hourFormat = String(hours).padStart(2, "0");
  const minuteFormat = String(minutes).padStart(2, "0");
  const secondFormat = String(remainingSeconds).padStart(2, "0");

  // Returns the HH:MM:SS format
  return `${hourFormat}:${minuteFormat}:${secondFormat}`;
}

/**
 * Sums hours based on a criterion.
 *
 * @param {string[]} sum_range - Set of time intervals in HH:MM:SS format.
 * @param {number[]} criteria_range - Set of criteria corresponding to the time intervals.
 * @param {number} criterion - The criterion for which hours should be summed.
 * @returns {string} Sum of the passed durations, or an error message.
 */
function sumHoursIf(sum_range, criteria_range, criterion) {
  if (!allAreArrays(sum_range, criteria_range))
    return "Pass the intervals for the calculation!";

  if (!allArraysHaveSameLength(sum_range, criteria_range))
    return "Intervals must be the same size";

  // Filters the time intervals for the specific criterion
  const hoursToSum = sum_range.filter(
    (row, index) =>
      String(criteria_range[index]).trim() == String(criterion).trim()
  );

  // Converts the filtered hours to seconds
  const hoursInSeconds = hoursToSum.map((n) => convertHMSToSeconds(n));

  // Sums all the seconds
  const sumOfSeconds = hoursInSeconds.reduce((accumulator, currentValue) => {
    return accumulator   currentValue;
  }, 0);

  // Converts the total seconds back to HH:MM:SS format
  return convertSecondsToHMS(sumOfSeconds);
}

/**
 * Sums hours based on criteria.
 *
 * @param {string[]} sum_range - Set of time intervals in HH:MM:SS format.
 * @param {number[]} criteria_range1 - First set of criteria corresponding to the time intervals.
 * @param {number} criterion1 - The first criterion for which hours should be summed.
 * @param {string[]} criteria_range2 - Second set of criteria corresponding to the time intervals.
 * @param {string} criterion2 - The second criterion for which hours should be summed.
 * @returns {string} Sum of the passed durations, or an error message.
 */
function sumHoursIf2(
  sum_range,
  criteria_range1,
  criterion1,
  criteria_range2,
  criterion2
) {
  if (
    !allAreArrays(
      sum_range,
      criteria_range1,
      criteria_range2
    )
  )
    return "Pass the intervals for the calculation!";

  if (
    !allArraysHaveSameLength(
      sum_range,
      criteria_range1,
      criteria_range2
    )
  )
    return "Intervals must be the same size";

  // Filters the time intervals for the passed criteria
  const hoursToSum = sum_range.filter(
    (row, index) =>
      String(criteria_range1[index]) == String(criterion1).trim() &&
      String(criteria_range2[index]).trim() === String(criterion2).trim()
  );

  // Converts the filtered hours to seconds
  const hoursInSeconds = hoursToSum.map((n) => convertHMSToSeconds(n));

  // Sums all the seconds
  const sumOfSeconds = hoursInSeconds.reduce((accumulator, currentValue) => {
    return accumulator   currentValue;
  }, 0);

  // Converts the total seconds back to HH:MM:SS format
  return convertSecondsToHMS(sumOfSeconds);
}

Como usar?

Os critérios podem ser texto ou números, mas as horas devem ser formatadas como "Texto Simples". Vá para o script do aplicativo, cole o script e pressione “CTRL S”. Feito. Para usá-lo, é o mesmo processo de uma fórmula nativa.

Uma vez aplicada a fórmula, podemos tratá-la novamente como um tipo que o programa entende usando VALUE; seu código deve ficar assim:

=VALUE(sumHoursIf2($C$2:$C$11;$D$2:$D$11;C$14;$E$2:$E$11;$B15))

Se tudo deu certo, este deve ser o seu resultado:

Categoria Filme Série
Assistência 5:19:00 0:50:00
Assistindo 0:00:00 2:25:01
Quero assistir 3:00:00 2:05:00

Só uma dica, espero que tenham gostado, e se tiverem sugestões deixem nos comentários. Saúde.

Postagem original: https://dev.to/casewinter/como-somar-horas-no-google-sheets-usando-criterios-para-filtrar-linhas-364p

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/casewinter/google-sheets-how-to-build-a-sumifs-for-hours-16ee?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3