"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إضافة ساعات في جداول بيانات Google باستخدام معايير لتصفية الصفوف؟

كيفية إضافة ساعات في جداول بيانات Google باستخدام معايير لتصفية الصفوف؟

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

يا شباب! أريد اليوم أن أشارك نصًا مفيدًا جدًا قمت بإنشائه لحل مشكلة يومية شائعة.

إذا سبق لك أن حاولت إضافة "مدة" في جداول بيانات Google، فربما لاحظت أن صيغ SUMIF وSUMIFS لا تعمل لإضافة فترات الأحداث أو المنتجات بناءً على معايير محددة. يمكن أن يكون هذا عائقًا اعتمادًا على نوع الحساب الذي يتعين عليك القيام به. ولكن لا تقلق! تتيح لك جداول بيانات Google إنشاء نصوص JavaScript واستخدامها كصيغ مخصصة.

في البرنامج النصي الخاص بي، قمت بإنشاء شكلين مختلفين: الأول يقبل معيارًا واحدًا والثاني يقبل معيارين. أخطط لتحسين هذا في المستقبل لجعل الوظيفة أكثر مرونة.

من الجدير بالذكر أن الصيغ المخصصة لا تُرجع قيمًا قابلة للحساب مباشرة بواسطة البرنامج. للتغلب على هذه المشكلة، يمكنك تغليف النتيجة باستخدام الدالة =VALUE(). بعد ذلك، ما عليك سوى تطبيق التنسيق المطابق لنوع البيانات - في حالتنا، "المدة". هل أنت مستعد للتحقق من النص؟

إنشاء بيانات عامة للاختبار

أولاً، لنقم بإنشاء بيانات لاختبار الصيغة. لقد استخدمت صديقنا GPT لهذا الغرض.

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

البرنامج النصي

حاولت توثيق كل شيء قدر الإمكان. قررت تقسيمها إلى وظائف أصغر واستخدام شيء أكثر تصريحًا لزيادة وضوح الكود.

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

كيفية الاستخدام؟

يمكن أن تكون المعايير نصًا أو أرقامًا، ولكن يجب تنسيق الأوقات كـ "نص عادي".

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

انتقل إلى تطبيق البرنامج النصي:

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

الصق البرنامج النصي و"CTRL S". مستعد. لاستخدامها هي نفس عملية الصيغة الأصلية.

بمجرد تطبيق الصيغة، يمكننا العودة إلى التعامل معها كنوع يفهمه البرنامج باستخدام VALUE، يجب أن يبدو الكود الخاص بك كما يلي:

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

إذا سار كل شيء على ما يرام، فيجب أن تكون هذه هي النتيجة:

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

كانت مجرد نصيحة، أتمنى أن تنال إعجابكم، وإذا كان لديكم اقتراحات، اتركوها في التعليق. العناق.

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/casewinter/como-somar-horas-no-google-sheets-usando-criterios-para-filtrar-linhas-364p?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ Study_golang @163.com حذف
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3