Arrayformula for the Data Validation and if function - arrays

Action item tab:
Column A - Score - is based on calculations from the columns F-N
I want to assess the score according to the following range and assign the task in column B from a drop down menu.
Minor update 89-50
Localize 49-20
Major update 49-20
Merge 49-20
No action item 90-100
Redirect 0-19
It is important to keep the dropdown menu since the data is going to be checked manually and the status might be changed.
So generally speaking, I want to implement 2 steps:
Automatically to range the data and assign the status
To have the possibility to change the status manually.
I tried to implement it through Data Validation and simply failed.
https://docs.google.com/spreadsheets/d/1WsnAQPrrL2o4me55ghVaQHx2ZE9aisgbEIDtG6HQFn4/edit?usp=sharing

First of all, three of your ranges are conflicting, it will still work but will always get the first one which is "Localize". You should update the ranges for Localize, Major update and Merge so they don't have conflicting ranges.
Conflict:
Formula (A4):
=ifs(and(A4 < 90, A4 >= 50), "Minor update",
and(A4 < 50, A4 >= 20), "Localize",
and(A4 < 50, A4 >= 20), "Major update",
and(A4 < 50, A4 >= 20), "Merge",
and(A4 <= 100, A4 >= 90), "No action item",
and(A4 < 20, A4 >= 0), "Redirect")
Just drag the formula onto the cells below (e.g A5-A9). I am not using Arrayformula as it will fail if you modify a cell within its range.
Output:
Modifying F5 and G5 (Extracted data) to 0:
Note:
You can have formula on top of your Data Validations
I modified your Data Validations for column B into from =Legend!$A$2:$B$7 to =Legend!$A$2:$A$7 since we only need the action items, not the range.
You can still manually change your column B values BUT it won't automatically update ever again after manually changing it unless you copy the formula again to that cell and it will overwrite your manual input and go back to automatically updating based on the column F-N values.
These changes were already applied to your sheet, kindly check if it meets your expected output.

Related

Rotate table based on drop down input

Data
I have a table B3:F7 with a changing range, more or less rows and columns.
Objective
I want to Rotate the original table using the input from the drop down I2:M2 to get the result like 90, 180, 270 Rotation.
To clarify
I don't want to choose between them; I want the original table to be Rotated according to the input of the dropdown. I have only the original table and the data is mixed and the range is growing.
The formatting is for demonstration only.
Progress
I tried transpose twice =TRANSPOSE(TRANSPOSE(B3:F7)) to get 180 result, but the output is reverted back to the original form B3:F7.
Sources
Make a copy
try:
=ARRAYFORMULA(IF(I2=O3, B3:F7,
IF(I2=O4, TRANSPOSE(SORT(B3:F7, ROW(B3:F7), 0)),
IF(I2=O5, TRANSPOSE(SORT(TRANSPOSE(SORT(B3:F7, ROW(B3:F7), 0)), ROW(B3:F7), 0)),
IF(I2=O6, SORT(TRANSPOSE(B3:F7), ROW(B3:F7), 0), )))))

How do you use ArrayFormula with arrays (after aggregation)?

In my example:
https://docs.google.com/spreadsheets/d/1QQNTw_r9-q-FqVNwUoYklup73niZCFyO0VDUYImP5fo/edit?usp=sharing
I'm using Google Forms as an eBay clone to sell rare items. Each bid is outputted from the form to the "Data" worksheet and then I have ArrayFormulas set up inside the "Processed" worksheet. The idea is that I want to process the bids so that we filter everything except the items with the highest bids. All data should be automatically updated, hence why I want to use ArrayFormulas.
My strategy is that in colum A, I first filter all unique items (=unique(filter(Data!A2:A,Data!A2:A<>""))) and end up with:
Jurassic Park 6-Pog Hologram Set
Princess the Bear TY Beanie Baby
Holographic 1st Ed Charizard
However, then in column B, we have to find the highest bid that corresponds to that unique item, e.g.:
=IF(ISBLANK(A2),,ArrayFormula(MAX(IF(Data!A2:A=A2,Data!B2:B))))
However, I don't want to have A2 be a single cell (A2) but an array (A2:A) so that it doesn't have to be manually copied down the rows. Similarly, I also want columns D and E to be automatic as well. Is there any way to achieve this?
Not sure if it would be considered easier than the previously posted answer, but in case this thread is found in the future, I think that this is a slightly simpler way to solve these kinds of problems:
Try this on a fresh tab in cell A1:
=FILTER(Data!A:D,COUNTIFS(Data!A:A,Data!A:A,Data!B:B,">"&Data!B:B)=0)
I did some research and found an answer very similar to what you were looking for. After rearranging the formula slightly to match your sheet, I was able to get this to work:
=ArrayFormula(vlookup(query({row(Data!A2:A),sort(Data!A2:C)},"select max(Col1) where Col2 <> '' group by Col2 label max(Col1)''",0),{row(Data!A2:A),sort(Data!A2:D)},{2,3,4,5},0))
This formula automatically populates product name, highest bid, username, and timestamp. I ran some tests, adding my own random names and values into the data sheet, and the formula worked great.
Reference: https://webapps.stackexchange.com/a/75637
use:
={A1:D1; SORTN(SORT(A2:D, 1, , 2, ), 9^9, 2, 1, )}
translated:
{A1:D1} - headers
SORT(A2:D, 1, , 2, ) - sort 1st column then 2nd column descending
9^9 - output all possible rows
2 - use 2nd mode of sortn which will group selected column
1 - selected column to be marged based on unique values

How can I filter by comparing a column to its own row items

I have a bunch of data being pushed in a google sheet row by row. Each row has a reference number (COL A) and a date (COL D). For every reference number, I want to find the latest updated row. It's necessary that this is done by arrayformula.
So far I have a combination of arrayformula and filter. However it doesn't work as expected as one of the filter arguments is A2:A=A2:A. Obviously this is always true. What I want it to do is compare A2:A=A2 for row 2, then compare A2:A=A3 for row 3 etc. Without dragging down. Since the data is growing automatically
=arrayformula(if(len(A2:A),max(filter({D2:D},A2:A=A2:A)),))
https://docs.google.com/spreadsheets/d/16pbGiisFcsrHfrFKowzzkpw03Lw79yACjut96xxyWW4/edit?usp=sharing
try in E1:
={"Last Update";
ARRAYFORMULA(IFNA(VLOOKUP(A2:A; SORT({A2:A\ D2:D}; 2; 0); 2; 0)))}
You can paste this either of this formulas in F2 and then drag it down.
=QUERY($A$2:$E,"SELECT D WHERE A = '"&A2&"' ORDER BY D desc LIMIT 1")
=ARRAYFORMULA(MAX(FILTER({$D$2:$D},$A$2:$A=A2)))
*Edit:
Try this formula in F2 and there is no need to drag it down:
=ARRAYFORMULA(IFERROR(VLOOKUP(A2:A,QUERY(QUERY($A$2:$E,"SELECT A, max(D) WHERE A <> '' GROUP BY A"),"SELECT * OFFSET 1",0),2,FALSE),""))
You'll probably have give column F a date format, but it's a one time thing. Good luck :)

How can I keep references to changing spreadsheet constant?

I have 2 columns in a sheet that are referencing another dynamic sheet which has new rows added at the top all the time.
I want column A to be a copy of column A in Sheet1, so this works to put in cell A1:
={Sheet1!A:A}
However, I want column B to a formula applied to every row in column B of Sheet1. Problem is, when I put in a a formula, e.g.
=formula(B1)
then it changes to
=formula(B30)
when 29 new rows added
I want it to stay as B1, but it won't. If I use an absolute reference $B$1 then I can't copy the formula down the column.
Any wizards out there to help me out?
If you want to get the matching row from a column of another worksheet, then use INDEX and ROW, like so:
=FORMULA(INDEX(Sheet1!$B:$B, ROW(), 1))
This will always return the value in Column B of Sheet1, on the same Row as the formula is in on Sheet2 - even if you insert rows at the top of Sheet1
You can do "partially absolute reference" (I don't know the correct way of saying this).
You can lock only the column so would be =$A1 which means that it will never change the column but when you drag down the formula, it will change to =$A2, =$A3...
Or you can lock only the row typing =A$1 This way it will be locked on the row only.
You can do this also by pressing F4 several times: 1 time will lock both, the 2nd time will lock the row only, the 3rd time the column only and the 4th time will delete the locking.
the proper way would be to use INDIRECT like:
=INDIRECT("Sheet1!B1:B")

OBIEE - Change pivot table row values based on prompt

I currently have a set of 12 pivot tables that I display based on a prompt. So the user simply clicks on a 'View By:' dropdown and chooses which table to view. This was accomplished through simple 'dummy tables' and a presentation variable.
My question: Can I set up a similar prompt to change the row values in my pivot tables?
For example, my row values are currently annual (12, 24, 36, ...). I would like to give the user the option to view the data on a quarterly (3, 6, 9, ...) and monthly (1, 2, 3, ...) basis.
Can I add a second 'View By:' dropdown so the user can select both the table, and row values the table is displayed on?
I'm assuming you have a period dimension, with columns for year, quarter and month. If not, you may be able to use a variant of this.
If so, you can use the index col function. To set this up:
You would have a variable prompt, setting a presentation variable with the options [annual, quarterly, monthly]
In your answer, you would have one period column, changing the column formula to use the indexcol function. It would look something like:
INDEXCOL(CASE '#{myPresentationVariable}' WHEN 'annual' THEN 0 WHEN 'quarterly' THEN 1 WHEN 'monthly' THEN 2 END, period.year, period.quarter, period.month)
I was making this much more difficult than it needed to be. The solution is to create Groups for the different buckets of values I was referencing ((1,2,3,...), (3,6,9,...), (12,24,36,...)). Then simply set the corresponding column filter to Is Prompted and add the newly created Groups as Choices to your prompt's choice list.

Resources