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 ?
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 |
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); }
Les critères peuvent être du texte ou des chiffres, mais les heures doivent être formatées en « Texte brut ».
Accédez à l'application de script :
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 :
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.
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