"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment ajouter des heures dans Google Sheets en utilisant des critères pour filtrer les lignes ?

Comment ajouter des heures dans Google Sheets en utilisant des critères pour filtrer les lignes ?

Publié le 2024-08-22
Parcourir:821

Salut les gars! Aujourd'hui, je souhaite partager un script très utile que j'ai créé pour résoudre un problème quotidien courant.

Si vous avez déjà essayé d'ajouter une « durée » dans Google Sheets, vous avez peut-être remarqué que les formules SUMIF et SUMIFS ne fonctionnent pas pour ajouter des durées d'événements ou de produits en fonction de critères spécifiques. Cela peut être un frein selon le type de calcul que vous devez effectuer. Mais ne vous inquiétez pas ! Google Sheets vous permet de créer des scripts JavaScript et de les utiliser comme formules personnalisées.

Dans mon script, j'ai créé deux variantes : la première accepte un critère et la seconde jusqu'à deux. Je prévois d'améliorer cela à l'avenir pour rendre la fonction encore plus flexible.

Il convient de rappeler que les formules personnalisées ne renvoient pas de valeurs directement calculables par le programme. Pour contourner ce problème, vous pouvez envelopper le résultat avec la fonction =VALUE(). Ensuite, appliquez simplement le formatage correspondant au type de données — dans notre cas, « durée ». Prêt à découvrir le script ?

Création de données génériques pour les tests

Tout d'abord, générons des données pour tester la formule. J'ai utilisé notre ami GPT pour cela.

Titre Durée Catégorie Statut
Le Martien 01:00:00 Film Je l'ai déjà regardé
Interstellaire 02:49:00 Film Je l'ai déjà regardé
John Wick 01:30:00 Film Je l'ai déjà regardé
Avengers : Fin de partie 03:00:00 Film Je veux regarder
Choses étranges 00:45:00 Série Participer
Le sorceleur 01:00:01 Série Participer
Le Mandalorien 00:40:00 Série Participer
Briser le mauvais 00:50:00 Série Je l'ai déjà regardé
La Maison du Papier 00:55:00 Série Je veux regarder
Game of Thrones 01:10:00 Série Je veux regarder

Scénario

J'ai essayé de tout documenter du mieux possible. J'ai décidé de le séparer en fonctions plus petites et d'utiliser quelque chose de plus déclaratif pour augmenter la clarté du code.

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

Comment utiliser ?

Les critères peuvent être du texte ou des chiffres, mais les heures doivent être formatées en « Texte brut ».

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

Accédez à l'application de script :

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

Collez le script et "CTRL S". Prêt. Son utilisation est le même processus qu'une formule native.

Une fois la formule appliquée, nous pouvons recommencer à la traiter comme un type que le programme comprend en utilisant VALUE, votre code devrait ressembler à ceci :

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

Si tout s'est bien passé, voici votre résultat :

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

C'était juste un conseil, j'espère que cela vous a plu, et si vous avez des suggestions, laissez-les dans le commentaire. Câlins.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/casewinter/como-somar-horas-no-google-sheets-usando-criterios-para-filtrar-linhas-364p?1 En cas d'infraction, veuillez contacter study_golang @163.com supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3