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