Я надеюсь заполнить даты на основе даты начала и частоты до даты окончания.
Ввод (этот список будет расти):
Делаем вывод:
Я придумал, как получить первую строку, но только дату, используя:
=ARRAYFORMULA( IFERROR( Sheet1!$A$2 + (SEQUENCE((Sheet1!$B$2 - Sheet1!$A$2) / Sheet1!$C$2 + 1, 1, 0) * Sheet1!$C$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,)
Спасибо большое, дружище, именно то, что я хотел!
Следующие работы.
=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, ссылки на диапазон обновятся автоматически.
Отвечает ли это на ваш вопрос? Как получить массив дат выходных после введенной даты из того же месяца с помощью одной формулы в Google Sheet? «Идиоматический» способ в Google Sheet создать любую последовательность дат (или что-то еще), которую вы хотите, — это сгенерировать избыточное количество, а затем отфильтровать то, что вы хотите. И это описано в другом вопросе. В вашем конкретном вопросе вы можете просто объединить слои + сортировать поверх него.