Функция Google Sheets IF(TIMEVALUE) с использованием ошибок диапазона (ARRAYFUNCTION)

Я использую форму для ввода информации о времени в лист (это только один аспект листа, который используется в других вычислениях). У меня есть старые данные о времени из архивного файла, время которого имеет значение продолжительности, т. е. 28:00:00 или 28 часов. Новые вводимые данные используют время начала, время окончания и количество сотрудников для расчета продолжительности, т. е. 8:00:00 – 12:00:00 * 10 = 40:00:00 (40 часов). ) продолжительность. Моя проблема в том, что у меня есть эта формула

=IF(ISBLANK(I2000) + ISBLANK(J2000), N2000 + O2000, SUMPRODUCT((TIMEVALUE(J2000) - TIMEVALUE(I2000)) - IF(AND(TIMEVALUE(I2000) < TIMEVALUE("12:00 PM"), TIMEVALUE(J2000) > TIMEVALUE("12:30 PM")), 1/48, 0), H2000)))

Эта формула работает хорошо и правильно рассчитывает продолжительность в столбцах N + O, если есть ввод продолжительности времени, или рассчитывает продолжительность отработанного времени (включая 30-минутный перерыв, если применимо). Это работает индивидуально для пронумерованных строк. Если я настрою это на диапазон, я получу ошибку «#VALUE error Параметр TIMEVALUE «не может быть проанализирован до даты/времени». Это привело меня к использованию ARRAYFORMULA, но я все еще получаю ту же ошибку. Это текущая формула, которую я Я использую. Есть ли способ заставить это работать правильно? Мне нужно, чтобы эта функция была в массиве, потому что лист, из которого она фильтрует данные, регулярно сортируется по дате производства, и когда сортировка меняется, она не корректируется. формула для этой строки.

=ARRAYFORMULA(IF(ISBLANK(I2:I) + ISBLANK(J2:J), N2:N + O2:O, SUMPRODUCT((TIMEVALUE(J2:J) - TIMEVALUE(I2:I)) - IF(AND(TIMEVALUE(I2:I) < TIMEVALUE("12:00 PM"), TIMEVALUE(J2:J) > TIMEVALUE("12:30 PM")), 1/48, 0), H2:H)))

Пожалуйста, отредактируйте свой вопрос, включив в него образец ваших данных в текстовом формате уценки.

Blindspots 24.04.2024 00:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ваша формула, скорректированная для возврата нескольких строк. Он вернет пустое значение для любой строки, где ни один из i,j,n,o не содержит значения. Вы можете ограничить диапазоны, установив конечную строку.

=LET(h,H2:H, i,I2:I, j,J2:J, n,N2:N, o,O2:O,
  ARRAYFORMULA(
    IF(LEN(TEXTJOIN(,1, i, j, n, o)),
      IF(ISBLANK(i)+ISBLANK(j), n+o,
        h*((j*1-i*1)-(i*1<0.5)*(j*1>25/48)*(1/48))),)))

Или эквивалент

=ARRAYFORMULA(
    IF(LEN(TEXTJOIN(,1, I2:I, J2:J, N2:N, O2:O)),
      IF(ISBLANK(I2:I)+ISBLANK(J2:J), N2:N+O2:O,
        H2:H*((J2:J*1-I2:I*1)-(I2:I*1<0.5)*(J2:J*1>25/48)*(1/48))),)))

Или

=ARRAYFORMULA(
    IF(LEN(TEXTJOIN(,1, H2:H)),
      IF(ISBLANK(I2:I)+ISBLANK(J2:J), N2:N+O2:O,
        H2:H*((TIMEVALUE(J2:J)-TIMEVALUE(I2:I))-(TIMEVALUE(I2:I)<0.5)*
          (TIMEVALUE(J2:J)>25/48)*(1/48))),)))



Производительность

Чисто ради интереса я провел несколько сравнений производительности формул, основанных на x*1 vs. TIMEVALUE(x), а также с LET и без него. Результаты в таблице ниже являются репрезентативными, хотя фактические цифры различались в зависимости от итерации.

Некоторые выводы:

  1. Работа с числовой длительностью с использованием x*1 работала примерно в 3,5 раза быстрее, чем TIMEVALUE(x).
  2. Работа с длительностью текстовых строк с использованием x*1 работала примерно в 1,5 раза быстрее, чем TIMEVALUE(x).
  3. Написание формулы с LET или без него не оказало заметного влияния на производительность какой-либо формулы, что отражает то, что LET использовался только для сокращения набора текста и улучшения кода, а не для сохранения результатов вычислений для повторного использования.
  4. Увеличение количества проверяемых заполненных и незаполненных строк в x раз оказало сопоставимый эффект на время выполнения, которое также увеличилось бы в тот же раз.

Таблица результатов

  • Набор данных состоял из 3000 заполненных листов из 5000 строк.

  • «(несколько)» представляет время выполнения относительно самой медленной формулы в этом столбце.

  • Время форматируется как minutes:seconds.milliseconds, поэтому даже самая медленная формула (49 миллисекунд) достаточна для ваших нужд, однако для более сложных формул знание того, какие строительные блоки будут работать в 3 раза быстрее, может иметь значительное, а иногда и экспоненциальное влияние.

    Тип формулы б/у ЛЭТ НОМЕР(x) ЕСТЕКСТ(x) Прошло   (несколько) Прошло   (несколько) х*1 да 0:00.013   (3,8x) 0:00.026   (1,6x) х*1 - 0:00.014   (3,5x) 0:00.027   (1,6x) ВРЕМЯЗНАЧЕНИЕ(x) да 0:00.045   (1,1x) 0:00.042   (1,0x) ВРЕМЯЗНАЧЕНИЕ(x) - 0:00.049   (1,0x) 0:00.040   (1,1x)

Все они работают для строк, которые не имеют данных в I или J (время начала и время окончания), но выводят ошибку «#NAME? - неизвестное имя диапазона: H.» в строках с данными в I. Дополнительно для простоты Формула: J никогда не будет иметь данных, если у меня не будет данных, и у меня никогда не будет данных, если данные есть у N. Единственный критерий, по которому необходимо выполнить поиск, — это «есть ли данные в «I»? Если да, используйте первую формулу (N:N+O:O), в противном случае используйте вторую.

Mike Daugherty 25.04.2024 19:52

Мне удалось исправить проблему, определив диапазон H в первом экземпляре LET. Спасибо за помощь.

Mike Daugherty 25.04.2024 20:13

Другие вопросы по теме