Arrayformula to calc sum for dynamic offset range - google-sheets

I'm trying to calculate values with an arrayformula, based on the last 14 days (the last 14 rows, since every row is 1 day).
I want N110:N to have the values (in example: sum) from, let's say, I96:I110.
Means, the values in N110 should be sum(I96:I110). For N111 it should be sum(I97:I111) etc.
I have something like = ARRAYFORMULA("I"& Row(I110:I)-14 & ":I" & Row(I110:I)) which returns
I96:I110
I97:I111
I98:I112
...
in each row.
I cannot wrap this into the arrayformula, since Indirect() is not working here and is returning only the first value.
I also tried with offset, which led to the same result.
Basically I'm trying to use an arrayformula to calc values by a dynamic offset range with a fixed size (14).
I could solve it with google apps script, but I want to try with arrayformula.

try:
=INDEX(IFNA(VLOOKUP(ROW(A1:A),
QUERY(SPLIT(FLATTEN(ROW(A1:A)&"×"&ARRAY_CONSTRAIN(
SPLIT(FLATTEN(QUERY(TRANSPOSE(IF(ROW(A1:A)<=TRANSPOSE(ROW(A1:A))=TRUE,
TRANSPOSE(A1:A)&"×", )),,9^9)), "×"), 9^9, 14 +N("14 day window"))), "×"),
"select Col1,sum(Col2)
where Col2 is not null
group by Col1"), 2, )))

Make sure that N110:N is empty, and then place the following formula in N110:
=ArrayFormula(IF(I110:I="",,SUMIF(ROW(I96:I),"<="&ROW(I110:I),I96:I)-SUMIF(ROW(I96:I),"<="&ROW(I110:I)-15,I96:I)))
This formula assumes that there are no blank cells interspersed between numbers in I96:I (though there may be blank cells after the number list runs out).
Essentially, this sums all cells in in the range up to the current row and then subtracts the total of all cells in rows prior to "15 cells back" as marked from the current cell.

Related

Sum two ranges separately in one formula

How can I do one single formula to sum two ranges and display them in their respective column.
Here I'm using SUM formula in each cell but I'm sure there must be a single formula that can accomplish this.
Value 1 and Value 2 are the ranges to add them together in Sum row.
Here is an example picture.
Since arrayformula does not support sum, I suppose you could also do this in C12:
=arrayformula(C10:I10+C11:I11)
Clear the formula you have in row 12 and then enter in C12
=index(mmult({1,1}, --C10:I11))
Change range to suit and see if that helps?

Google Sheets: how to sum a dynamic range across columns using a variable to determine range length

I'm trying to write a formula in Google Sheets that will enable me to sum a range of values across columns, where I can manipulate the number of cells to be summed across the column with a variable. For example:
if my variable is 5, then I want to sum(D3:H3);
and if my variable is 9, then I want to sum(D3:L3)
Furthermore, I want a formula that I can drag across columns so that the range it's summing moves relative to the cell the formula is in. In the example above with the variable=5:
the formula in cell A3 would be sum(D3:H3);
and the formula in cell B3 would be sum(E3:I3)
etc.
I created a sample spreadsheet here for more context.
Thanks for reading!
I've added a sheet ("Erik Help"). See formula in B5:P5.
Here is the B5 formula (which was then dragged across to P5):
=ArrayFormula(SUM(FILTER($B$1:$1,COLUMN($B$1:$1)>(COLUMN()-$B$4),COLUMN($B$1:$1)<=COLUMN())))
There may be an array approach. But since you have such limited data, this is just as effective with less time investment required to develop the solution.
In plain English, the formula reads "Sum the numbers from B1:1 where the column is greater than X rows back and no greater than the current column" (where X is the value set in B4).
paste in column B and drag to the right:
=IF(COLUMN()-1<$B1, "-", SUM(INDIRECT(
ADDRESS(3, COLUMN()-($B1-1))&":"&
ADDRESS(3, COLUMN()))))

Count number of times values increase in range - Google Sheets

how are you? I'm just not sure what to do here, but I surely can use your help!
I have a series of values in a row range, such as in the following:
1000 2000 1500 2100 3200
I need to figure out a google sheets formula to put in the 6th cell of this row that counts the number of times the value of any cell is greater than the one to the left of it. In this example, my result should be 3.
Is there any way that this can be done? In Excel or Google Sheets, either is great to learn.
Thank you
You can also try the following formula
=COUNTIF(QUERY({{"";TRANSPOSE(B2:F2)},{TRANSPOSE(B2:F2);""}},
"select Col1-Col2 offset 1 label Col1-Col2 ''",0), "<0")
Assuming you have data in A2:E, place the following in F2:
=ArrayFormula(IF(A2:A="",,MMULT(IF(B2:E>A2:D,1,0),SEQUENCE(4,1,1,0))))
Since there are only four columns that might be greater than others (B:E), you can structure it this way. MMULT is hard to explain, but it essentially multiplies everything in each row of one matrix (range) by everything in another range and then adds them. SEQUENCE just forms a column of four 1's by which to multiply then add together everything in each row of the first range. Since anything times 1 is the original number, this just serves to to row-by-row addition.
This formula will process as many rows as have data in A2:E.
try in 7th column on row 2:
=ARRAYFORMULA(MMULT(IF(A2:E4<B2:F4, 1, 0), {1;1;1;1;1}^0))

Apply VlLOOKUP till last non-empty row in google sheets

I have an automatically expanding google in which I am applying a Vlookup formula to extract values from another sheet matching the values from the main sheet.
This is the Vlookup formula-
=VLOOKUP(A2, IMPORTRANGE("1MNRMKGkC-c0COugUWpXOe5OxJXfmdXGboxAPhf5SaLA", "Sheet1!B3:E420"),4,0)
I want the formula to be auto applied to the new entries which get auto added in the main sheet. I used this formula I found on a website to apply this formula to the whole column also taking care of any empty cells in between.
=ArrayFormula(IF(ISBLANK(A2:A), "", VLOOKUP(A2:A, IMPORTRANGE("1MNRMKGkC-c0COugUWpXOe5OxJXfmdXGboxAPhf5SaLA", "Sheet1!B3:E420"),4,0)))
My problem is that after using this formula when a new entry is auto added to column A in the sheet, it gets added to 1001th row instead of the next non-empty row, because this formula is being applied to whole column.
Is there some way to apply the Vlookup to just be applied till last non-empty row, so that my next automatic entry gets added in the next empty row? Or any other alternative solution?
Thanks for the help!
try:
=ARRAYFORMULA(QUERY(IF(ISBLANK(A2:A),,VLOOKUP(A2:A,
IMPORTRANGE("1MNRMKGkC-c0COugUWpXOe5OxJXfmdXGboxAPhf5SaLA", "Sheet1!B3:E420"), 4, 0)),
"where Col1 is not null", 0))
Since we don't have sheet for reference assuming new data is added to new column.
Try this fromula =ARRAYFORMULA(If(A2:A="","",VLOOKUP(A2:A, IMPORTRANGE("1MNRMKGkC-c0COugUWpXOe5OxJXfmdXGboxAPhf5SaLA", "Sheet1!B3:E420"),4,0)))
This will do vlookup once there is new data in Column 'A'

How to copy every 3 rows down (2 row cell with formula and 1 blank cells) for the next formula just go for 1 cells instead of go for 3 cells

I'm trying to copy 2 rows of formula and 1 blank row to fill down my required row, but when I'm trying to do that the formula in next row jump 3 cells, I want it so the next formula I paste just the next cell
Link to sheet:
https://docs.google.com/spreadsheets/d/1VAhls2rzaAJZiiRA-Z0Q2MusfCa8v1YoD1n2NxaCwzQ/edit?usp=sharing
sorry for my very terrible way of describing my problem, because I'm rarely using English for coding Q&A
all you need is this I guess:
=ARRAYFORMULA(SUBSTITUTE(TEXT(REGEXREPLACE(TO_TEXT(TRANSPOSE(
SPLIT(TEXTJOIN( , 1, TRANSPOSE(QUERY(TRANSPOSE(QUERY(
{IF('2019'!D2:D=0, "♥", '2019'!D2:D*0.0001),
IF('2019'!G2:G=0, "♥", '2019'!G2:G*0.0001)},
"select Col1,Col2,'♦ ♠' label '♦ ♠'''")), , 500000))), " "))),
"♦|♠|♥", ""), "0.0000"), "0.0000", ""))
if you need to output real number then wrap it after ARRAYFORMULA( into VALUE()
demo spreadsheet
The automatic alteration of formulas in Sheets when moving, copy-pasting, or drag-copying is not very sophisticated. It's also not configurable.
There may be more elegant workarounds, but I think the simplest thing to do is stop relying on it. If Sheets is bad at changing your formula, try a different formula that doesn't need to be changed in that staggered way. For example, A5 and A6 could be:
=if(INDIRECT("2019!D"&ROW()+1)=0,"",INDIRECT("2019!D"&ROW()+1))
=if(INDIRECT("2019!D"&ROW() )=0,"",INDIRECT("2019!G"&ROW() ))
This works because in A5 we want to refer to sheet 2019 row 6, so we use an INDIRECT reference to A5's row number (5) plus 1 (6).
When we're in A6, we instead want 2019 D6 and G6, so there's no adding 1.
If you can read my pseudo-formulas, your example sheet seems to follow the pattern:
  if 2019!D–next row = 0, output nothing, otherwise 2019!D–next row
  if 2019!D–this row = 0, output nothing, otherwise 2019!G–this row
  <blank cell>
Using the above formulas, if you select those three cells (formula, formula, blank), then drag-copying them keeps them working the way you wanted.

Resources