Расчет общего дневного времени в электронной таблице с временными диапазонами на ячейку - PullRequest
2 голосов
/ 16 июня 2020

У меня есть основная таблица c, чтобы отслеживать время, потраченное на действие.

Идея состоит в том, чтобы зафиксировать временной диапазон для каждой ячейки. Например, 10:00 - 12:30 означает 2 часа 30 минут.

Перерывы можно делать в течение дня. При возобновлении в новую ячейку вводится новый временной диапазон.

Я хочу вычислить общее время в день. Например, понедельник, 15 июня - это 2.5 + 4.5 = 7 hours.

spreadsheet with time ranges

Алгоритм, о котором я думаю, примерно

for each cell that contains time ranges for the given day
  start, end = split(cell, " - ")
  diff_decimal = (end - start) * 24
  total += diff_decimal

Но я не уверен, как это сделать с помощью функций электронных таблиц. Начальная точка, которую я использую, - это =SPLIT(B2," - "), но я уже заблокирован, так как не знаю, как обрабатывать возвращаемое значение.

PS Проблема может быть упрощена, если использовать несколько «start» и «end» столбцы с одним значением на ячейку. Но я хочу попробовать данный формат, который предпочитаю, прежде чем пробовать другой подход.

1 Ответ

3 голосов
/ 16 июня 2020

Это решение Google Таблиц, так как в Excel нет формул регулярных выражений.

Попробуйте эту формулу (поместите ее в G1, столбец G:G отформатирован как число):

={
  "Total";
  ARRAYFORMULA(
    IF(
      A2:A = "",
        "",
        MMULT(
          IFERROR(
            (  TIMEVALUE(REGEXEXTRACT(B2:F, "-\s+(\S+)"))
             - TIMEVALUE(REGEXEXTRACT(B2:F, "(\S+)\s+-"))) * 24,
            0
          ),
          SEQUENCE(COLUMNS(B2:F), 1, 1, 0)
        )  
    )
  )
}        

Если вы отформатируете G:G как Продолжительность, вы можете удалить часть * 24.

enter image description here

UPD

Добавлено игнорирование неправильно отформатированных ячеек с помощью IFERROR - в данном случае только 0.

Лучше добавьте это настраиваемое правило условного форматирования для B2:F, чтобы отмечать (красным на скриншоте) периоды времени в неправильный формат и go исправить:

=AND(B2 <> "", NOT(IFERROR(REGEXMATCH(B2, "\b(\d|[01]\d|2[0-3]):[0-5]\d\s*-\s*(\d|[01]\d|2[0-3]):[0-5]\d\b"), False)))
...