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

Google Таблицы: SUMIFS для продолжительности (часов), часть 2

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

Google Sheets: SUMIFS para durações (horas), parte 2

На днях я опубликовал сообщение, показывающее, как создать две специальные формулы для таблиц Google для добавления часов на основе критериев (здесь). Их проблема, на мой взгляд, в том, что они не были гибкими. Что делать, если мне нужно N критериев? Что ж, теперь вы можете!

Теперь формула принимает 3 набора данных: длительность, критерии и инструкции фильтра. Вернемся к тестовой таблице:

Заголовок Продолжительность Категория Статус Нравиться
Марсианин 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 Ряд Я хочу посмотреть

Давайте обновим скрипт нашего приложения. Я предлагаю создать еще одну тестовую таблицу и начать новую, помня, что часы должны быть указаны в «обычном тексте». Код здесь:

/**
 * Converte uma string no formato HH:MM:SS para o total em segundos.
 *
 * @param {string} hms - A string no formato HH:MM:SS.
 * @returns {number} O total em segundos.
 */
function converterHMSParaSegundos(hms) {
  const partes = String(hms).split(":");
  const [horas, minutos, segundos] = partes;
  return Number(horas) * 3600   Number(minutos) * 60   Number(segundos);
}

/**
 * Converte um número de segundos para o formato HH:MM:SS.
 *
 * @param {number} segundos - O total de segundos.
 * @returns {string} O tempo no formato HH:MM:SS.
 */
function converterSegundosParaHMS(segundos) {
  const horas = Math.floor(segundos / 3600);
  const minutos = Math.floor((segundos % 3600) / 60);
  const segundosRestantes = segundos % 60;
  return `${String(horas).padStart(2, "0")}:${String(minutos).padStart(
    2,
    "0"
  )}:${String(segundosRestantes).padStart(2, "0")}`;
}

/**
 * Filtra as linhas da matriz de dados com base nos critérios fornecidos e retorna as durações correspondentes.
 *
 * @param {Array} duracoes - Array de durações em formato de texto.
 * @param {Array>} dados - Matriz de dados onde cada linha corresponde a um conjunto de valores.
 * @param {Array} criterios - Array de critérios para filtrar as linhas da matriz de dados.
 * @returns {Array} Retorna as durações que correspondem aos critérios.
 */
function filtroDeLinhas(duracoes, dados, criterios) {
  const linhas_na_matriz = duracoes.length;
  const matriz_de_criterios_concatenada = [];

  for (let linha = 0; linha } duracoes - Array de durações em formato de texto.
 * @param {Array>} intervalo_de_criterios - Matriz de dados onde cada linha corresponde a um conjunto de valores.
 * @param {...string} criterios - Um ou mais critérios para filtrar as linhas da matriz de dados.
 * @returns {string} A soma das durações no formato HH:MM:SS.
 */
function somarHorasComCriterios(
  duracoes,
  intervalo_de_criterios,
  ...criterios
) {
  // Verifica se todos os argumentos são arrays
  if (
    !Array.isArray(duracoes) ||
    !Array.isArray(intervalo_de_criterios) ||
    !Array.isArray(criterios)
  ) {
    return "Passe os intervalos para o cálculo!";
  }

  const horasParaSomar = filtroDeLinhas(
    duracoes,
    intervalo_de_criterios,
    criterios.flat(Infinity)
  );
  const horasEmSegundos = horasParaSomar.map((n) =>
    converterHMSParaSegundos(n)
  );
  const somaDosSegundos = horasEmSegundos.reduce(
    (acumulador, valorAtual) => acumulador   valorAtual,
    0
  );

  return converterSegundosParaHMS(somaDosSegundos);
}

Допустим, я прошёл:

Фильм | Я уже это смотрел | Нет

Моя сумма будет: 04:19:00

И помните, что я могу обернуть это собственной функцией: =VALUE и отформатировать ее как «длительность», и таблицы вернутся к рабочим суммам, как если бы использовалась собственная формула!

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/casewinter/google-sheets-sumifs-para-duracoes-horas-parte-2-3bf0?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3