Google sheets - How to find rows whose date falls into a range? - google-sheets

I have a table that looks like this (its populated via a plugin):
bugs:
ID | created | closed
1 2/3/2021 6/4/2021
I want to have another sheet, that extracts how many bugs were open at a given week:
bugs by week:
week | number of open bugs (needs to be auto-filled)
1/1/2021 3
7/1/2021 6
In this example 3 means, that on the 1st week of January there were 3 bugs opened (=created between jan.1 and 7).
How can I accomplish this with a single formula in Google sheets?
This is my best effort, but it just fills out a single row instead all of them:
=ARRAYFORMULA(COUNT(FILTER(bugs!C:C, bugs!C:C>A2, bugs!C:C<A2+7)))

Try this:
=array_constrain(
ArrayFormula(countif(weeknum($C$2:$C$31),E3:E)),
counta(E3:E),1)
My sheet is here:
https://docs.google.com/spreadsheets/d/1EOkBvI4No369LEpIUPH0xDhPgLffrw0ccIRFDK-PXKM/copy
After some thinking I found that it's more complicated. You can count bugs that were open during this week or closed during that week or remained open throughout the week.

You can use this formula.
No helper.
=INDEX(IF(C2:C="",,COUNTIF(WEEKNUM(C2:C),"="&{WEEKNUM(C3);WEEKNUM(C3:C)})))
OR this (if you want)
=INDEX(IF(C2:C="",,COUNTIF(WEEKNUM(C2:C),"="&{WEEKNUM(C3);WEEKNUM(C3:C)})&" in week "&WEEKNUM(C2:C16)))

Related

Filtering Overlapping Dates within Set Date Range

I have a couple of questions I need for a semi-annual report:
I have a list of interns, each with their own start and end dates of service. I am looking to filter the list of those who worked within a given range of dates. I want any intern who has their term of service that overlaps with the range dates.
I am also looking to calculate how many weeks + months they worked within the same range of dates.
Here is the Spreadsheet.
I have tried your basic filter with date ranges, but I am not able to figure out the overlapping aspect of the list. For example, if the date range is 2021-2022, and an intern worked from 2020-2022, it would not filter it, as the start date is outside of the range.
Any help would be greatly appreciated!
This formula will work for all 3 columns:
=FILTER(
{
A2:A,
ARRAYFORMULA(
1+
TRUNC(ARRAYFORMULA(IF(C2:C<G2,C2:C,G2)-43101)/7)-
TRUNC(ARRAYFORMULA(IF(B2:B>F2,B2:B,F2)-43101)/7)
),
ARRAYFORMULA(
1+
DATEDIF(
ARRAYFORMULA(IF(B2:B>F2,B2:B,F2)),
ARRAYFORMULA(IF(C2:C<G2,C2:C,G2)),
"M"
)
)
},
ARRAYFORMULA((IF(C2:C>G2,G2,C2:C) - IF(B2:B<F2,F2,B2:B)) >0 )
)
For calculating the months the formula uses the DATEDIF function.
For calculating the weeks, I am choosing as reference an arbitrarily defined week zero starting on Monday, 2018-01-01 (day 43101 in the Network Time Protocol).
Link to Google Sheet
Check for Overlap
For a simple pull-down formula to check if each intern has any time overlapping the range, use the standard Overlap Formula:
Min(end1,end2)-Max(start1,start2)
which gives
=if(min(C2,G$2)>=max(B2,F$2),"Yes","No")
or for an array formula:
=ArrayFormula(lambda(start,end,if(if(end<G2,end,G2)>=if(start>F2,start,F2),"Yes","No"))
(filter(B2:B,A2:A<>""),filter(C2:C,A2:A<>"")))
Months
#Markus's approach is perfect, but for an alternative one could use:
=datedif(eomonth(max(B2,F$2),-1)+1,eomonth(min(C2,$G$2),0)+1,"M")
(for Jeremy as an example) in other words dial the start date back to the first of the month and the finish date forwards to the start of the next month and use Datedif to get the overlap in full months. The point of this is that it could be adapted for weeks as well.
With the lookup on names in column I2:
=datedif(eomonth(max(xlookup(I2,A$2:A$8,B$2:B$8),F$2),-1)+1,eomonth(min(xlookup(I2,A$2:A$8,C$2:C$8),$G$2),0)+1,"M")
or as an array formula:
=ArrayFormula(lambda(rNames,Names,start,end,datedif(eomonth(if(xlookup(rnames,Names,start)>F2,xlookup(rnames,Names,start),F2),-1)+1,eomonth(if(xlookup(rnames,Names,end)<G2,xlookup(rnames,Names,end),G2),0)+1,"M"))
(filter(I2:I,I2:I<>""),filter(A2:A,A2:A<>""),filter(B2:B,A2:A<>""),filter(C2:C,A2:A<>"")))
Weeks
You have a few options here.
(1) Having found the number of complete or partial months of overlap, just divide the number of days in those months by seven to get corresponding number of weeks:
=ArrayFormula(lambda(rNames,Names,start,end,quotient(datedif(eomonth(if(xlookup(rnames,Names,start)>F2,xlookup(rnames,Names,start),F2),-1)+1,eomonth(if(xlookup(rnames,Names,end)<G2,xlookup(rnames,Names,end),G2),0)+1,"D"),7))
(filter(I2:I,I2:I<>""),filter(A2:A,A2:A<>""),filter(B2:B,A2:A<>""),filter(C2:C,A2:A<>"")))
(2) Use the same logic as for months to get number of partial or complete working weeks of overlap:
=ArrayFormula(lambda(rNames,Names,start,end,quotient(datedif(if(xlookup(rnames,Names,start)>F2,xlookup(rnames,Names,start),F2)-weekday(if(xlookup(rnames,Names,start)>F2,xlookup(rnames,Names,start),F2)),if(xlookup(rnames,Names,end)<G2,xlookup(rnames,Names,end),G2)+7-weekday(if(xlookup(rnames,Names,end)<G2,xlookup(rnames,Names,end),G2),3),"D"),7))
(filter(I2:I,I2:I<>""),filter(A2:A,A2:A<>""),filter(B2:B,A2:A<>""),filter(C2:C,A2:A<>"")))
(3) Just get number of complete weeks of overlap by dividing number of days by 7:
=ArrayFormula(lambda(rNames,Names,start,end,quotient(datedif(if(xlookup(rnames,Names,start)>F2,xlookup(rnames,Names,start),F2),if(xlookup(rnames,Names,end)<G2,xlookup(rnames,Names,end),G2),"D"),7))
(filter(I2:I,I2:I<>""),filter(A2:A,A2:A<>""),filter(B2:B,A2:A<>""),filter(C2:C,A2:A<>"")))

Count cells with content horizontally if the date is today

This is related to my previous question in this link but this time I want an arrayformula (or better) that I can place on the top cell of the column to count the cells on the left if Column A or Date Submitted is dated today.
I'll be adding another column to count if dated yesterday. I'm assuming use of today() and today()-1 would do it?
Here is the sample Google Spreadsheets Sample
Here is a formula you can use to count if the date is today:
=ArrayFormula(MMULT(n(ARRAYFORMULA(if((A2:A=today())*(E2:I<>"")>0, 1, ))),(transpose(COLUMN(E2:I)^0))))
The extra 0s can be gotten rid of with a simple IF() statement:
=ArrayFormula(if(A2:A<>today(),,MMULT(n(ARRAYFORMULA(if((A2:A=today())*(E2:I<>"")>0, 1, ))),(transpose(COLUMN(E2:I)^0)))))
Also, as you mentioned, today()-1 does work for finding yesterday:
=ArrayFormula(if(A2:A<>today()-1,,MMULT(n(ARRAYFORMULA(if((A2:A=today()-1)*(E2:I<>"")>0, 1, ))),(transpose(COLUMN(E2:I)^0)))))
References:
- https://infoinspired.com/google-docs/spreadsheet/array-formula-to-sum-multiple-columns-in-google-sheets/

Combining multiple data from ID

I have a question for my current Spreadsheet A.
Now I'm trying to make a new sheet for report generation where:
Report shows each ticket recorded on spreadsheet A.
Each ticket have 3 recorded process time. (Verification, Repair, QA)
The month for when the job ticket is first registered.
For illustration purpose, new sheet should look like this:
Ticket ID
Verification
Repair
QA
Month
T-001
X Hour
Y Hour
Z Hour
9
T-002
X Hour
Blank if no recorded time
Blank if no recorded time
9
...
...
...
...
...
Can Google Sheets do that? If can, how do I do it?
I have tried looking for some tutorial videos on Vlookup/Hlookup/Query/Search/Find, but I cant seem to get the results I needed.
EDITED: Changed question 3 from Name to Month
My solution is not the most elegant but it works:
https://docs.google.com/spreadsheets/d/1dEMYbI751pp55YF5M0V19U0QbytsabgwAO_97I1LXqw/copy
First get all ticket names using UNIQUE formula
=unique(C3:C)
When you got it, you have to find rows using 2 conditions:
Process & Ticket. In order to get it using VLOOKUP I make temporary array that contains Process and Ticket columns stitched together and duration column.
Then I use VLOOKUP using 2 stitched keys
=ifna(
arrayformula(
vlookup(G2&$F$3:$F,ArrayFormula({$B$3:$B&$C$3:$C,$D$3:$D}),2,false)))
Ifna prevents from error messages displayed when no value is found.
First arrayformula lets work this formula for an entire column.
Last task is to determine name of an employee. I use vlookup, but as name is futher left then Ticket, I have to make a temporary array {C3:C,A3:A} to search for name.
Warning: Vlookup is listing only first name found on the list.

How to inverse the order of form submissions on Google Sheets

I recently created a Google form and linked the responses to Google Sheets (so that the submissions to the Google form were automatically inserted on the sheet).
However, I would like the latest responses to appear on top of the sheets, rather than them compiling "downwards".
Is there any way to do this?
To clarify my question if you didn't understand it: If a response is entered at say 1 PM and another response at 2 PM, then the 1 PM response is on the first row of the sheets, and the 2 PM one on the second- I would like to "switch" this order.
Create a new tab/sheet and use the following formula in cell A1
=QUERY(Responses!A1:Z,"where A is not null order by A",1)
(please -as always- adjust formula according to your ranges and locale)

How can I highlight cells in Google Sheets if current month?

How can I highlight cells in Google Sheets if current month?
The cells have Jan-2017, Feb-2017 etc. and not dates.
I just want the current month highlighted so that the rest of the team can keep track of our monthly stats.
I'm supposing the column that has the months is A, and that the actual values of each cell is the first day of each month (so 2/1/2017 for February for example).
Select where you want the conditional formating to go, and open the conditional formatting sidebar.
Choose "Custom Formula" from the dropdown, and paste the following in:
=$A:$A=(today()-day(today())+1)
What we are doing here is:
=A$:A$ - Look in column A for the following
today() get todays date
-day(today()) get the day and subtract it from the today in the previous point
+1 add 1 to the result because 2/8/2017 - 8 = 2/0/2017, which google sheets actually recognizes as 1/31/2017, so by adding 1 it will become 2/1/2017 which is what is wanted.
The result of this sum is then compared to the data found in A$:A$ and the results which match the sum (today()-day(today())+1) are highlighted.
Just for the record, this may work as well using conditional formatting's custom formula:
=month($A:$A)=month(today())
Considering the dates are in the column A

Resources