Заполнение дат на основе частоты

Я надеюсь заполнить даты на основе даты начала и частоты до даты окончания.

Ввод (этот список будет расти):

+ А Б С Д Э Ф 1 Дата начала Дата окончания Частота Расходы Категория  Компания 2 02.02.2024 02.17.2024 14 545 Корова Первые фермеры 3 02.03.2024 02.17.2024 7 23 Овца глубинка 4 02.07.2024 02.17.2024 3 23 Свиньи Ковбои прежде всего

Делаем вывод:

+ А Б С Д Э 1 Дата Частота Расходы Категория  Компания 2 02.02.2024 14 545 Корова Первые фермеры 3 02.03.2024 7 23 Овца глубинка 4 02.07.2024 3 23 Свиньи Ковбои прежде всего 5 02.10.2024 7 23 Овца глубинка 6 02.10.2024 3 23 Свиньи Ковбои прежде всего 7 02.13.2024 3 23 Свиньи Ковбои прежде всего 8 02.16.2024 14 545 Корова Первые фермеры 9 02.16.2024 3 23 Свиньи Ковбои прежде всего 10 02.17.2024 7 23 Овца глубинка

Я придумал, как получить первую строку, но только дату, используя:

=ARRAYFORMULA( IFERROR( Sheet1!$A$2 + (SEQUENCE((Sheet1!$B$2 - Sheet1!$A$2) / Sheet1!$C$2 + 1, 1, 0) * Sheet1!$C$2) ) 

Я сделал EXAMPLE_SHEET, чтобы было легче понять

Отвечает ли это на ваш вопрос? Как получить массив дат выходных после введенной даты из того же месяца с помощью одной формулы в Google Sheet? «Идиоматический» способ в Google Sheet создать любую последовательность дат (или что-то еще), которую вы хотите, — это сгенерировать избыточное количество, а затем отфильтровать то, что вы хотите. И это описано в другом вопросе. В вашем конкретном вопросе вы можете просто объединить слои + сортировать поверх него.

Argyll 04.04.2024 08:59
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вот один из подходов, который вы можете опробовать:

=sort(let(Ξ,tocol(,1), reduce(Ξ,Input!A2:index(Input!A:A,match(,0/(Input!A:A<>""))),lambda(a,c,vstack(if (iserror(a&""),Ξ,a),let(x,offset(c,,1),y,offset(c,,2),Σ,quotient(x-c,y)+1,if (or(c = "",x = ""),Ξ,
 hstack(sequence(Σ,1,c,y),chooserows(offset(c,,2,,4),sequence(Σ,1,1,0))))))))),1,1,2,)

Спасибо большое, дружище, именно то, что я хотел!

Webber 04.04.2024 09:25

Следующие работы.

=let(input,A2:A
    ,input_trimmed,offset(input,0,0,rows(tocol(input,3)))
    ,sort(reduce(tocol(,3),input_trimmed
                ,lambda(a,c,vstack(a
                       ,let(nrows,ceiling((offset(c,0,1)-c)/offset(c,0,2))
                           ,hstack(c+sequence(nrows,1,0,offset(c,0,2))
                                  ,arrayformula(if (sequence(nrows),offset(c,0,3,1,3)))))))),1,true))

Пояснения

Вы уже знаете, как генерировать нужные даты. И на него отвечали несколько раз, в том числе здесь.

Единственное, что следует отметить относительно генерации даты (для будущих читателей), это то, что лучше использовать date+sequence(...) вместо того, чтобы помещать дату начала в sequence(), что вы уже сделали. Первый сохраняет форматирование в date, а второй — нет.

Таким образом, последовательность дат, отображенная из первой строки, равна

=let(nrows,ceiling((B2-A2)/C2)
    ,arrayformula(A2+sequence(nrows,1,0,C2)))

Поскольку вам нужно повторение остальных данных, вы можете использовать if (sequences(nrows,...)), чтобы получить повторение и объединение следующим образом.

=let(nrows,ceiling((B2-A2)/C2)
    ,arrayformula(hstack(A2+sequence(nrows,1,0,C2)
                        ,if (sequence(nrows),D2:F2))))

Здесь одиночный arrayformula в любом месте заставит Google Sheet отобразить выходные данные массива в соседних ячейках.

Наконец, вы можете использовать reduce, чтобы «зациклить» весь список входных данных, использовать vstack, чтобы объединить их вместе, а затем использовать sort, чтобы отсортировать общий вывод, который дал первоначальный ответ.

Последнее, что нужно сделать, это включить ввод неопределенного диапазона. Входной параметр reduce и offset должен быть явным диапазоном Google Sheet (вместо встроенного массива). Чтобы преобразовать неопределенный A2:A в диапазон с нужным количеством строк, мы используем offset(A2:A,0,0,...), потому что результат offset является явным диапазоном. Чтобы получить правильное количество строк, мы можем использовать tocol(...,3) для фильтрации пустых строк. Эта последняя часть в ответе закодирована как input_trimmed, чтобы вы могли видеть, где она находится. Хотя, конечно, она больше нигде не используется повторно, и вы можете поместить формулу непосредственно во второй параметр reduce.

Кроме того, я использовал фиксированные числа в offset, чтобы вы могли более четко увидеть, что они означают относительно вашего текущего вопроса. Чтобы сделать ваш лист более надежным, вы можете сделать числа смещения относительно реальных столбцов, например. offset(c,0,column(B:B)-column(A:A)) вместо offset(c,0,1). Таким образом, если вы в конечном итоге вставите новые столбцы между текущими столбцами A и столбцами B, ссылки на диапазон обновятся автоматически.

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

Похожие вопросы