「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 行をフィルタリングする条件を使用して Google スプレッドシートに時間を追加するにはどうすればよいですか?

行をフィルタリングする条件を使用して Google スプレッドシートに時間を追加するにはどうすればよいですか?

2024 年 8 月 22 日に公開
ブラウズ:576

やあ、みんな!今日は、日常のよくある問題を解決するために作成した、非常に便利なスクリプトを共有したいと思います。

Google スプレッドシートで「期間」を追加しようとしたことがある方は、特定の基準に基づいてイベントや商品の期間を追加する場合、SUMIF 式と SUMIFS 式が機能しないことに気づいたかもしれません。実行する必要がある計算の種類によっては、これが障害となる場合があります。でも心配しないでください。 Google スプレッドシートを使用すると、JavaScript スクリプトを作成し、カスタム数式として使用できます。

私のスクリプトでは 2 つのバリエーションを作成しました。1 つ目は 1 つの基準を受け入れ、2 つ目は最大 2 つの基準を受け入れます。将来的にはこれを改善して、より柔軟な機能を提供する予定です。

カスタム数式はプログラムによって直接計算可能な値を返さないことを覚えておく価値があります。これを回避するには、結果を =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