«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как добавить часы в Google Таблицы, используя критерии для фильтрации строк?

Как добавить часы в Google Таблицы, используя критерии для фильтрации строк?

Опубликовано 22 августа 2024 г.
Просматривать:473

Привет, ребята! Сегодня я хочу поделиться суперполезным скриптом, который я создал для решения обычной повседневной проблемы.

Если вы когда-либо пытались добавить «длительность» в 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);
}

Как использовать?

Критерии могут быть текстовыми или цифровыми, но время должно быть отформатировано как «Обычный текст».

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

Перейдите в приложение-скрипт:

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

Вставьте скрипт и нажмите «CTRL S». Готовый. Использовать ее — тот же процесс, что и нативную формулу.

После применения формулы мы можем вернуться к обработке ее как типа, который программа понимает с помощью VALUE. Ваш код должен выглядеть следующим образом:

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

Если все прошло хорошо, ваш результат должен быть таким:

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

Это был всего лишь совет, надеюсь, он вам понравился, и если у вас есть предложения, оставляйте их в комментариях. Обнимаю.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/casewinter/como-somar-horas-no-google-sheets-usando-criterios-para-filtrar-linhas-364p?1 Если есть какие-либо нарушения, свяжитесь с Study_golang. @163.com удалить
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3