Heim >Web-Frontend >js-Tutorial >Google Sheets: SUMIFS für Dauern (Stunden), Teil 2

Google Sheets: SUMIFS für Dauern (Stunden), Teil 2

WBOY
WBOYOriginal
2024-08-17 08:42:311177Durchsuche

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

Diese Tage habe ich einen Beitrag verfasst, der zeigt, wie man zwei benutzerdefinierte Formeln für Google Sheets erstellt, um Stunden basierend auf Kriterien hinzuzufügen (hier). Ihr Problem ist meiner Meinung nach, dass sie nicht flexibel waren. Was ist, wenn ich N-Kriterien möchte? Nun, jetzt können Sie es!

Jetzt benötigt die Formel drei Datensätze: die Dauer, die Kriterien und die Anweisungen zum Filtern. Gehen wir zurück zur Testtabelle:

Título Duração Categoria Status Curti
Perdido em Marte 01:00:00 Filme Já assisti Sim
Interestelar 02:49:00 Filme Já assisti Não
John Wick 01:30:00 Filme Já assisti Não
Vingadores: Ultimato 03:00:00 Filme Quero assistir
Stranger Things 00:45:00 Série Assistindo
The Witcher 01:00:01 Série Assistindo
O Mandaloriano 00:40:00 Série Assistindo
Breaking Bad 00:50:00 Série Já assisti Sim
A Casa de Papel 00:55:00 Série Quero assistir
Game of Thrones 01:10:00 Série Quero assistir

Aktualisieren wir unser App-Skript. Ich schlage vor, eine weitere Testtabelle zu erstellen und eine neue zu beginnen. Beachten Sie dabei, dass die Stunden im „Klartext“ angegeben werden müssen. Der Code ist hier:

/**
 * 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<string>} duracoes - Array de durações em formato de texto.
 * @param {Array<Array<string>>} dados - Matriz de dados onde cada linha corresponde a um conjunto de valores.
 * @param {Array<string>} criterios - Array de critérios para filtrar as linhas da matriz de dados.
 * @returns {Array<string>} 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 < linhas_na_matriz; linha++) {
    let incluirLinha = true;

    for (let coluna = 0; coluna < dados[linha].length; coluna++) {
      if (!criterios.includes(dados[linha][coluna])) {
        incluirLinha = false;
        break; // Sai do loop se algum critério não for atendido
      }
    }

    if (incluirLinha) {
      matriz_de_criterios_concatenada.push(duracoes[linha]);
    }
  }

  return matriz_de_criterios_concatenada;
}

/**
 * Soma as horas filtradas de acordo com os critérios fornecidos.
 *
 * @param {Array<string>} duracoes - Array de durações em formato de texto.
 * @param {Array<Array<string>>} 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);
}

Sagen wir, ich bestehe:

Film | Ich habe es bereits gesehen | Nein

Meine Summe wäre: 04:19:00

Und denken Sie daran, dass ich dies mit der nativen Funktion =VALUE umschließen und als „Dauer“ formatieren kann, und die Tabellen berechnen die Summen wieder so, als ob sie eine native Formel verwenden würden!

Wie ich im letzten Beitrag gesagt habe, hinterlassen Sie Ihre Kommentare mit Vorschlägen oder Fragen. Umarmungen.

Das obige ist der detaillierte Inhalt vonGoogle Sheets: SUMIFS für Dauern (Stunden), Teil 2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn