"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > جداول بيانات Google: SUMIFS للمدد (ساعات)، الجزء 2

جداول بيانات Google: SUMIFS للمدد (ساعات)، الجزء 2

تم النشر بتاريخ 2024-11-08
تصفح:799

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

في اليوم الآخر قمت بنشر منشور يوضح كيفية إنشاء صيغتين مخصصتين لأوراق Google لإضافة ساعات بناءً على المعايير (هنا). مشكلتهم في رأيي هي أنهم لم يكونوا مرنين. ماذا لو كنت أريد معايير N؟ حسنًا، الآن يمكنك ذلك!

الآن تأخذ الصيغة ثلاث مجموعات من البيانات: الفترات والمعايير وتعليمات التصفية. دعنا نعود إلى جدول بيانات الاختبار:

عنوان مدة فئة حالة يحب
المريخي 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