index 번호를 기준으로 Ext를 Max+1로 만든 다음에 Reduce로 이전행과 다르면 Ext를 앞에 추가한 일련번호 목록을 만들어 붙이고 목록에 빈줄을 추가한 배열을 일련번호 목록을 쪼개서 ChooseRows로 출력 =LET(DT,B2:C17, SN,SEQUENCE(ROWS(DT)), EXT,MAX(SN)+1, ID, REDUCE(,SN,LAMBDA(t,r,CONCAT(t,IF(INDEX(DT,r-1,1)<>INDEX(DT,r,1),","&EXT,""),",",r))), CHOOSEROWS(VSTACK(DT,{"",""}),TEXTSPLIT(ID,",")*1))
2025.08.01
2
원조백수Lv.30
Reduce로 누적마지막행과 현재행을 비교하여 바로 정리하는 방법도 가능하네요. =LET(DT,B2:C17, EXT, {"",""}, DROP(REDUCE(VSTACK(EXT,EXT),SEQUENCE(ROWS(DT)),LAMBDA(t,r, LET(X, TAKE(t,-1), VSTACK(DROP(t,-1),IF(INDEX(X,1,1)=INDEX(DT,r,1),X,VSTACK(X,EXT)),INDEX(DT,r,0)) ))),3))
REDUCE(Do(1),SEQUENCE(xRws-1)+1, LAMBDA(xAcc,i, LET(xPrev,Do(i-1), xCurr,Do(i), xTF,INDEX(xPrev,1)=INDEX(xCurr,1),
IF(xTF,VSTACK(xAcc,xCurr),VSTACK(xAcc,xIns,xCurr))))))
Reduce로 이전행과 다르면 Ext를 앞에 추가한 일련번호 목록을 만들어 붙이고
목록에 빈줄을 추가한 배열을 일련번호 목록을 쪼개서 ChooseRows로 출력
=LET(DT,B2:C17, SN,SEQUENCE(ROWS(DT)), EXT,MAX(SN)+1,
ID, REDUCE(,SN,LAMBDA(t,r,CONCAT(t,IF(INDEX(DT,r-1,1)<>INDEX(DT,r,1),","&EXT,""),",",r))),
CHOOSEROWS(VSTACK(DT,{"",""}),TEXTSPLIT(ID,",")*1))
=LET(DT,B2:C17, EXT, {"",""},
DROP(REDUCE(VSTACK(EXT,EXT),SEQUENCE(ROWS(DT)),LAMBDA(t,r, LET(X, TAKE(t,-1),
VSTACK(DROP(t,-1),IF(INDEX(X,1,1)=INDEX(DT,r,1),X,VSTACK(X,EXT)),INDEX(DT,r,0))
))),3))
=LET(r,B2:B17, rr,B3:B18, bc,B2:C17,t,IF(r=rr,bc,bc&";"), b,BYCOL(t,LAMBDA(a,TEXTJOIN(",",,a))), d,DROP(REDUCE("",b,LAMBDA(a,b,HSTACK(a,TEXTSPLIT(b,,{";",","})))),-1,1), IF(ISNUMBER(--d),--d,d))저도 만들어봤습니다.
보조열로 값이 다르면 ""대입하고... 같은곳에는 na()해서
tocol에서 에러부분제거하게 하고 다시 wraprows로 복원함.
=LET(Area,B3:D17,cols,COLUMNS(Area), 기준,INDEX(Area,,1),next,DROP(VSTACK(기준,""),1),Data,IF(기준<>next,"",NA()), TRIMRANGE(WRAPROWS(TOCOL(HSTACK(Area,CHOOSECOLS(Data,SEQUENCE(cols,,1,0))),2),cols)))구글스프레드시트로 해봤습니다.
=let(table,B2:C17,i,choosecols(table,1),p,choosecols(table,2),u,unique(i),c,counta(u),
r,reduce(,sequence(c),lambda(a,c,vstack(a,filter(table,i=index(u,c)),wraprows(,2,)))),
chooserows(r,sequence(1,rows(i)+c,2)))