Conditionally sum based on text substrings in Google Sheets - google-sheets

Suppose the data is text with certain consistent patterns, such as a subject in uppercase font followed by a space and a two-digit number representing time spent.
I would like to summarize all the data by a single number representing the time spent on MATH, which is 55 (minutes).
I am interested in arriving at the answer of 55 (minutes) in a single step.
I am able to isolate the number of minutes spent on MATH for each cell (possibly zero), but I do not know how to arrive at the sum of 55 minutes in a single step.

You may try:
=index(sum(ifna(--regexextract(A:B,D1&" (\d+)"))))

Give a try on the following formula-
=SUM(INDEX(REGEXEXTRACT(QUERY(FLATTEN(INDEX(TRIM(SPLIT(TOCOL(A:B,1),",")))),"where Col1 contains 'MATH'"), "(\d+\.?\d+)")*1))

Related

Trying to only SUM values in one column based on if the adjacent cells in another column contain a formula

So I'm creating a Google Sheets doc that contains my hours and overtime for an hourly position I have, and how much overtime I'll need to make the amount of money I need to make to survive.
In addition to this I am also trying to track my hours so I can track the actual amount of money I'm making.
So I have a projected clock out time in Column B that uses a formula to tell me what time I need to ideally clock out at based on how many hours I need and what time I clocked in at. When I clock out, I enter the actual time I clocked out at.
In Column C I have the total amount of hours I worked that day, formatted in duration based on the difference between the value in Column A and Column B. If I haven't entered in a value in Column B, it shows me the ideal amount of hours I need that day.
I want to calculate my actual hours worked per week as I'm working that week, so I need to ONLY sum the values in Column C if the adjacent value in Column B is NOT a formula. So I need it to sum the values in column C if I've entered the actual time that I clocked out at in column B.
I've looked up this question and tried multiple solutions I've found here, even tried troubleshooting with ChatGPT, but most are just trying to sum the range that contains the values/formula, and not summing a different column based on if another column has formulas or not.
There seems to be a lot of posts that come super close but don't seem to work for how I need this to work.
Edit: Here is the example sheet.
So F3:F6 are values that have been manually entered, while F:7 has been calculated by a formula.
I need H9 to sum the values of H3:H7, but only the values adjacent to the times in the F column that have been manually entered. In this example, I need it to sum H3:H6 and ignore H7 until I enter a time and remove the formula in F7.
try:
=SUMPRODUCT(MAP(F3:F7,LAMBDA(z,IFNA(FORMULATEXT(z),1))),H3:H7)
You may filter and check if there is a formula with FORMULATEXT. If there isn't it will throw a #N/A error. Then with ISNA it will keep the values in which its adjacents did'nt have a formula:
=SUM(FILTER(C:C,BYROW(B:B,LAMBDA(b,ISNA(FORMULATEXT(o))))))

Google sheets- how to calculate the average value of the last n days, given that n number is variable?

I need some help to calculate the moving average of the previous n days to date, given that n number is variable due to any given day can contain multiple values insertion (usually from 2 to five). So one specific day can contain several values.
This sheet is specifically related to weight tracking, here is the link:
https://docs.google.com/spreadsheets/d/1KhewGXtpElPYtjM4RpA4j2b9fkz17XcA518SPImg4p8/edit?usp=sharing
in the image you can see that for yyyy-mm-dd 2021/07/13 i want the average of the previous 54 and 55 values respectively
Thanks
I see no reason why this wouldn't be possible with a regular AVERAGEIFS() function. Did that not come up during your googling this question?
Here is a sheet created specifically for this question.
And here is the AVERAGEIFS() that I wrote in cell C3 on the MK.Help tab.
=IF(A3<A$3+C$1;;AVERAGEIFS(B:B;A:A;"<="&A3;A:A;">="&A3-C$1))

Sheets record time vs PB time delta

I'm making a spreadsheet to track and compare PB times in a racing game to records in different regions. Trying to figure a way to show a + / - time differential comparing my time to the selected region's record time.
I found a way to make this work in Excel (using the SIGN formula and an if statement to combine the + or - to the calculated difference, required 2 extra columns which had to be hidden which wasnt ideal), but sheets doesn't agree with the format of my data (Tried with it being number, text, time and a custom mm:ss.000 format too).
Is there a way to do this in sheets and preferably a way that just requires the single cell to figure it out?
Thanks!
*Looking to have the time differences shown in the J column, comparing my PB time to the times adjacent times
Here's one solution, but you need to adjust your time format from mm:ss.000 to HH:mm:ss.000 to be able to subtract your time values. Then use TEXT() to convert the results to your desired format
Sample Formula: (Format: +/- s.000)
=if($B$1-$B2>0,"+ ","- ")&text(abs($B$1-$B2),"s.000")
Sample Formula: (Format: +/- mm:ss.000)
=if($B$1-$B2>0,"+ ","- ")&text(abs($B$1-$B2),"mm:ss.000")
Output:

Google Spreadsheets Repeat Function Nth Times & Sum Results

I have the following function
=IF(RAND()<0.25,1,0)
RAND() returns any value between 0 to 1 in decimal format and the idea is that an item has a 25% chance of getting a 1. If it was less than 0.25 the rand() then its a hit and gets a 1 otherwise a 0. Now lets say I need to do this 100 times and add up the sum of all the '1's that were created, which in this case will average to around 25 for 25%. How do I do this in Google Spreadsheets?
Basically looking for a way to repeat a function n'th amount of times and sum the results.
I have looked around everywhere (youtube, google forums) and have not found any solutions.
I may as well put this as an answer because it tries to address the broader question of whether you can repeat a function (say) 100 times. The answer is, yes if the function is compatible with an array formula. Rand can't be used in this way because it doesn't take any arguments (neither do some other functions like countifs for some reason). But you could get round it by using Randbetween instead and providing it with 100 array elements. These are multiplied by zero so don't actually affect the answer, but Google Sheets still evaluates the function 100 times:
ArrayFormula(sum(if(randbetween(0,A1:A100*0+99)<25,1,0)))
or
=Sumproduct(if(randbetween(0,A1:A100*0+99)<25,1,0))
The result is each time you force this to re-calculate (by changing something in the range A1:A100 or by setting File -> Spreadsheet Settings -> (Tab) Calculation -> Recalculation to every minute) it will give an answer around 25.
To make it more resilient (allow any value in A1:A100 including error values) could try
=ArrayFormula(sum(if(randbetween(0,iferror(A1:A100/0,0)+99)<25,1,0)))
or
=Sumproduct(if(randbetween(0,iferror(A1:A100/0,0)+99)<25,1,0))
I don't know why I didn't do this in the first place
=ArrayFormula(sum(if(randbetween(0,row(A1:A100)*0+99)<25,1,0)))
then this easily allows for a variable range
=ArrayFormula(sum(if(randbetween(0,row(indirect("A1:A"&H1))*0+99)<25,1,0)))
where the number in H1 doesn't have to be limited to the number of rows in the sheet.
Okay so I found a very convoluted answer. If someone finds a better please let me know.
The first thing as the user |'-'| commented was to create a range on separate sheet.
Since I know that I will not be looking up more than 200 values at once I created my range to be 200 long of this formula.
=IF(RAND()<0.25,1,0)
This will create the initial list of random values.
The next step is you need to generate a randomizer seed. Which is basically a random number between the range you created. You can do this with
=RANDBETWEEN(1,200)
This should be on the same column as what you are trying to sum up later.
Next you want to create a dynamic string that you can access via arrayFormula later.
="Randomizer!B"&B12&":B"&B12+B3
In my case I had the 200 random numbers on a sheet called randomizer. Notice the &, this is how you connect strings. In my example B12 is the reference to the =RANDBETWEEN(1,200), and B3 is how many times I want the randomness to occur. It can be any value as long as it's less than the randomizer seed by the amount of times you want it to be random.
Finally refer to this string using, =SUM(ARRAYFORMULA(INDIRECT(B13))) , indirect lets you refer to a string as a cell and this is how I was able to create a dynamic range to calculate from.
I will say the advantage of this method is its super fast to calculate since the random numbers have been pre-computed.
The idea is that it will keep creating random ranges from the precomputed random numbers you created, and then summing those ranges, essentially calculating random numbers n'th amount of times.
Hope this helps someone.

I need to divide the last 3 non blank cells by the first 3 non blank cells

In my EXCEL 2010 spreadsheet I am dividing the sum of the last three weeks total hours in a YTD format by the first three weeks total hours, the date of which can vary by the open date. I am having to update my formula weekly for close to 100 different columns, so would like something that automatically selects the last three non zeros cells (note these cells have a formula that keeps them blank until my 'copy paste' page gets data for the date range) and divides the last three non zero cells by the first three non zero cells.
10/28/2012 786
11/4/2012 771
11/11/2012 822
11/18/2012 774
11/25/2012 708
12/2/2012 849
12/9/2012 816
12/16/2012 779
12/23/2012
12/30/2012
YTD last 3 wks vs. 1st 3wks 195%
The above is a very small section of the 'Hours Summary' spreadsheet for 1 owner. For many owners the first three weeks will not begin at the beginning of the year. I have done lots of research over several months, but have never found anything that works. Thank you in advance for any advice or tips!
If you're wanting the spreadsheet to be dynamic, I'm not sure it's possible without extensive use of LOOKUP tables - extensive enough to be more trouble than it's worth. However, if you're at all familiar with object-oriented programming (insofar as VBA fits that label), you might try to write a script in the macro suite. It's very thorough, and much more full-featured than you might think. Recording a macro, performing a number of tasks, and examining the resulting code is how I learned the language.

Resources