I am looking for a solution on either Google sheets or app script to check for overlapping dates for the same account. There will be multiple accounts and the dates won't be in any particular order. Here is an example below. I am trying to achieve the right column "check" with some formula or automation. Any suggestions would be greatly appreciated.
Start Date
End Date
Account No.
Check
2023-01-01
2023-01-02
123
ERROR
2023-01-02
2023-01-05
123
ERROR
2023-02-25
2023-02-27
456
OK
2023-01-11
2023-01-12
456
OK
2023-01-01
2023-01-15
789
ERROR
2023-01-04
2023-01-07
789
ERROR
2023-01-01
2023-01-10
012
OK
2023-01-15
2023-01-20
012
OK
I also found some similar past questions, but they don't have the "for the same account" component and/or requires some sort of chronological order, which my sheet will not have.
How to calculate the overlap between some Google Sheet time frames?
How to check if any of the time ranges overlap with each other in Google Sheets
Another approach (to be entered in D2):
=arrayformula(lambda(last_row,
lambda(acc_no,start_date,end_date,
if(isnumber(match(acc_no,unique(query(query(split(flatten(acc_no&"|"&split(map(start_date,end_date,lambda(start_date,end_date,join("|",sequence(1,end_date-(start_date-1),start_date)))),"|")),"|"),"select Col1,count(Col2) where Col2 is not null group by Col1,Col2",0),"select Col1 where Col2>1",1)),0)),"ERROR","OK"))(
C2:index(C2:C,last_row),A2:index(A2:A,last_row),B2:index(B2:B,last_row)))(
counta(A2:A)))
Briefly, we are creating a sequence of dateserial numbers between the start & end dates for each row, doing some string manipulation to turn it into a table of account number against each date, then QUERYing it to get each account number which has dateserials with count>1 (i.e. overlaps), using UNIQUE to get the distinct list of those account numbers, then finally matching this list against the original list of account numbers to give the ERROR/OK output.
(1) Here is one way, considering each case which could result in an overlap separately:
=ArrayFormula(if(A2:A="",,
if((countifs(A2:A,"<="&A2:A,B2:B,">="&A2:A,C2:C,C2:C,row(A2:A),"<>"&row(A2:A))
+countifs(A2:A,"<="&B2:B,B2:B,">="&B2:B,C2:C,C2:C,row(A2:A),"<>"&row(A2:A))
+countifs(A2:A,">="&A2:A,B2:B,"<="&B2:B,C2:C,C2:C,row(A2:A),"<>"&row(A2:A))
)>0,"ERROR","OK")
)
)
(2) Here is the method using the Overlap formula
min(end1,end2)-max(start1,start2)+1
which results in
=ArrayFormula(if(byrow(A2:index(C:C,counta(A:A)),lambda(r,sum(text(if(index(r,2)<B2:B,index(r,2),B2:B)-if(index(r,1)>A2:A,index(r,1),A2:A)+1,"0;\0;\0")*(C2:C=index(r,3))*(row(A2:A)<>row(r)))))>0,"ERROR","OK"))
(3) Most efficient is to use the original method of comparing previous and next dates, but then you need to sort and sort back like this:
=lambda(data,sort(map(sequence(rows(data)),lambda(c,if(if(c=1,0,(index(data,c-1,2)>=index(data,c,1))*(index(data,c-1,3)=index(data,c,3)))+if(c=rows(data),0,(index(data,c+1,1)<=index(data,c,2))*(index(data,c+1,3)=index(data,c,3)))>0,"ERROR","OK"))),index(data,0,4),1))(SORT(filter({A2:C,row(A2:A)},A2:A<>""),3,1,1,1))
HOWEVER, this only checks for local overlaps. not globally. You can see what I mean if you change the dataset slightly:
Clearly the first and third pair of dates have an overlap but G4 contains "OK". This is because each pair of dates is only checked against the adjacent pairs of dates. This also applies to the original reference cited by OP - here's an example where it would give a similar result:
The formula posted by #The God of Biscuits gives the correct (global) result :-)
Good Evening and thanks in advance for taking the time to read and help.
I have a 3 column excel file which I am trying to populate the 3rd column with a return value found next to the row its found in.
so for example I want to look at column MANAGERSFULLNAME for value
Cheryl Rommelfanger and find the match in column FULLNAME. Once the match is found I want to populate MANAGERSX2FULLNAME but not with the value found in FULLNAME but with the value next to in column MANAGERSFULLNAME
So for this example we look in MANAGERSFULLNAME for Cheryl Rommelfanger and find the match in FULLNAME Cheryl Rommelfanger then populate MANAGERSX2FULLNAME with
William Dearth
FULLNAME MANAGERSFULLNAME MANAGERSX2FULLNAME
Dena Peters Cheryl Rommelfanger
Kyle Marsh Melissa Hall
Cheryl Rommelfanger William Dearth
ive tried a few things and can only get a count not the value next to it.
=MATCH($E2&$F2,INDEX($B2:B4000&$C2:C4000,),)
=IF(ISERROR(MATCH(E2,F2,$B$2:B$4000,$C$2:C$4000,0)),"",E2)
=IF(ISERROR(MATCH(L2,$K$2:K$4000,0)),"",L20)
any help would be greatly appreciated.
So I apologize but I am having a bit of trouble understanding your columns, but the general idea is clear.
Your attempts are really close. You want to use index(match) as opposed to match(index). The link below describes how to do this.
Index match formula
If I'm understanding you correctly it sounds like you're trying to find and list the bosses boss so-to-speak to display a hierarchy of sorts. I'm using just columns A, B, and C (C being the managerx2fullname) this formula should work fine:
=index(B$2:B$4000,match(B2,A$2:A$4000,0))
You will of course need to change the columns to fit your needs. Don't include a dollar sign in B2 because you want this to increment as you drag the formula down the column. The link below shows a screen shot from my test. In it we see that in row 2 John is Adams boss, who in turn is Joe's boss. I think that's what you're shooting for here.
Screen shot
Can you please help me figure out the right formula for the below problem?
I want to count unique Item ID in Column A with a date range per agent.
You may find the link to the spreadsheet below:
https://docs.google.com/spreadsheets/d/1s-A3a-M5BlJI3xWNgeoL9ERKK056_0dsmSH7aae0TAY/
Thanks in advance for your help!
France
Based on your spreadsheet, you can nest a FILTER command inside of a COUNTUNIQUE function like so:
=COUNTUNIQUE(FILTER($A$2:$A,$B$2:$B=E2,$C$2:$C>=date(2018,3,1),$C$2:$C<=date(2018,3,8)))
You will have to enter the dates by hand, but the $B$2:$B=E2 will reference the Agent name from the E column in your spreadsheet. All of the references with a $ in google are absolute, and will not change as you move the function around within the sheet.
Option with QUERY for H2 and copied down to suit:
=count(query(A:C,"select count(A) where B='"&E2&"' and C>=date'2018-3-1' and C<=date'2018-3-8' group by A label count(A)''"))
Adjust the upper cutoff day to suit.
I was wondering if anyone had a script or way to randomly select a name based on a list. So heres the problem, i have one person who entered the raffle one time. The next person entered lets say 5 times and so on. The fist person should only get one chance to win while the next person should get 5 chances to win
Assuming the top row for labels and names in ColumnA, 'times' in ColumnB then:
In C2 and copied down to suit:
=sum(B$2:B2)
In D1:
=RANDBETWEEN(1,Sum(B:B))
Then:
=iferror(index(A:A,match(D1,C:C,0)),index(A:A,1+match(D1,C:C,1)))
Alternatively, list the "next person" five times as often as the other two, select the complete list, apply Data > Randomise range and pick the one at the top of the list, say.
I have been searching and searching and I've tried a dozen different things, and the array formula that added 50,000 rows to my sheet (I didn't even know that was possible...) and crashed my browser was the final straw. So I'm asking for help...
Basically, I have a static list of names in sheet1(Grades) that are sorted alphabetically. I have an importrange in sheet2(Data) with another list of names, not sorted alphabetically (And it cannot be sorted alphabetically.) Something like this:
Grades:
Bill
Charlie
Fred
George
Percy
Ron
and
Data:
Ron
Bill
Fred
Percy
Harry
Hermione
Molly
Arthur
What I need is to imput a formula in the cell below the last name on sheet1(Grades) that checks all of the names above that cell, compares them to the names on sheet2(Data), and returns the first name that's missing. For example:
Grades:
Bill
Charlie
Fred
George
Percy
Ron
(Formula Here) = Harry
(Formula Here) = Hermione
Etc.
The New names should always be at the bottom of the Data list, if that help any.
Here's a link to a copy of the spreadsheet.
Hope I got the permissions correct... Most of it was protected, but I think it should be open for edits now. Any help would be much appreciated. I really didn't think I was trying to do something that difficult, lol.
So I take it you want basically the difference between two lists. I've put this formula in the cell below the last entry in column B in Grades, hope this is what you want:
=filter(Data!A1:A40, iserror(match(Data!A1:A40, B5:B45, 0)))