Привет, ребята! Сегодня я хочу поделиться суперполезным скриптом, который я создал для решения обычной повседневной проблемы.
Если вы когда-либо пытались добавить «длительность» в Google Таблицах, вы, возможно, заметили, что формулы СУММЕСЛИ и СУММЕСЛИМ не работают для добавления длительности событий или продуктов на основе определенных критериев. Это может быть помехой в зависимости от типа расчета, который вам нужно выполнить. Но не волнуйтесь! Google Таблицы позволяют создавать сценарии JavaScript и использовать их в качестве пользовательских формул.
В моем скрипте я создал два варианта: первый принимает один критерий, второй — два. Я планирую улучшить это в будущем, чтобы сделать функцию еще более гибкой.
Стоит помнить, что пользовательские формулы не возвращают значения, которые можно вычислить непосредственно программой. Чтобы обойти эту проблему, вы можете обернуть результат функцией =VALUE(). Затем просто примените форматирование, соответствующее типу данных — в нашем случае «длительность». Готовы ознакомиться со сценарием?
Прежде всего, давайте сгенерируем данные для проверки формулы. Для этого я использовал наш друг GPT.
Заголовок | Продолжительность | Категория | Статус |
---|---|---|---|
Марсианин | 01:00:00 | Фильм | Я уже это посмотрел |
Интерстеллар | 02:49:00 | Фильм | Я уже это посмотрел |
Джон Уик | 01:30:00 | Фильм | Я уже это посмотрел |
Мстители: Финал | 03:00:00 | Фильм | Я хочу посмотреть |
Очень странные дела | 00:45:00 | Ряд | Присутствую |
Ведьмак | 01:00:01 | Ряд | Присутствую |
Мандалорец | 00:40:00 | Ряд | Присутствую |
Во все тяжкие | 00:50:00 | Ряд | Я уже это посмотрел |
Бумажный дом | 00:55:00 | Ряд | Я хочу посмотреть |
Игра престолов | 01:10:00 | Ряд | Я хочу посмотреть |
Я старался все задокументировать как можно лучше. Я решил разделить его на более мелкие функции и использовать что-то более декларативное, чтобы повысить ясность кода.
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); }
Критерии могут быть текстовыми или цифровыми, но время должно быть отформатировано как «Обычный текст».
Перейдите в приложение-скрипт:
Вставьте скрипт и нажмите «CTRL S». Готовый. Использовать ее — тот же процесс, что и нативную формулу.
После применения формулы мы можем вернуться к обработке ее как типа, который программа понимает с помощью VALUE. Ваш код должен выглядеть следующим образом:
=VALUE(somarHorasSe2($C$2:$C$11;$D$2:$D$11;C$14;$E$2:$E$11;$B15))
Если все прошло хорошо, ваш результат должен быть таким:
Это был всего лишь совет, надеюсь, он вам понравился, и если у вас есть предложения, оставляйте их в комментариях. Обнимаю.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3