How do I "stack" columns in Google Sheets? - google-sheets

I have a spreadsheet in which each line represents a conference presentation. There are columns for the attributes of each presentation, including for up to six presenters with their names, degrees, city, state, email institution, and bio:
enter image description here
I'd like to repeat the speakers' data in a second sheet, stacking them, like so:
enter image description here
I've tried a few solutions, and think that this is the closest to working as I expect:
=TRANSPOSE(SPLIT(TEXTJOIN("~",TRUE,TRANSPOSE('Program Submissions'!N2:N),TRANSPOSE('Program Submissions'!X2:X)),"~",FALSE,FALSE))
With this formula at the top of each column (adjusted to reference the appropriate column in the other sheet), it gives me:
enter image description here
That's not correct, however. John Doe should only have an MD, and Jane Smith should have an MFA, MBA, and BA. But Jane's 2nd and 3rd degree cells were shifted upward into John's empty cells.
I"ve also tried this:
=UNIQUE({'Program Submissions'!N2:N;'Program Submissions'!X2:X})
and this:
={filter('Program Submissions'!N2:N, len('Program Submissions'!N2:N)); filter('Program Submissions'!X2:X, len('Program Submissions'!X2:X)); filter('Program Submissions'!AH2:AH, len('Program Submissions'!AH2:AH))}
Neither of which seem as good as the solution above, either throwing errors in cells or having other cell-shifting issues.

try:
={N2:W2; X2:AG2}
which could be extended:
={N2:W10; X2:AG10}
to ensure no blank rows:
=QUERY({N2:W; X2:AG}, "where Col1 is not null", )
more at: https://stackoverflow.com/questions/73767719/

Related

Stack multiple queried Importranges with a single word between the two sets of imported data?

I have a master sheet that contains all of the data for other sheets. Column A in the master sheet is the name for who's sheet it will import to. So if the name is "John" then every row that has "John" in column A from the master sheet will be imported into John's sheet. I have the person's name in cell G1 of their own respective sheet and use the following formula.
=ARRAYFORMULA(IFNA(QUERY(IMPORTRANGE("LINK_TO_SHEET","Assignments!A2:Q"),"SELECT Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13 WHERE Col1='"&G1&"'",0),""))
Master sheet looks like this:
Assigned To
Name
State
City
John
Blake G.
Arizona
Phoenix
Andy
Chase C.
Arizona
Phoenix
John
Amy B.
New Mexico
Santa Fe
John
Bill S.
Texas
Austin
John's sheet will look like this:
Name
State
City
Blake G.
Arizona
Phoenix
Amy B.
New Mexico
Santa Fe
Bill
Texas
Austin
I want to separate the data based on what is in Col17 and put a single word between the two data sets. Col17 has either a Y or a N so I can just add AND Col17='N' to the existing formula. I double up the formula, but changed the last condition to be Col17='Y' so that I can pull the two data sets separately and on top of each other.
={ARRAYFORMULA(IFNA(QUERY(IMPORTRANGE("LINK_TO_SHEET","Assignments!A2:Q"),"SELECT Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13 WHERE Col1='"&G1&"' AND Col17='N'",0),""));ARRAYFORMULA(IFNA(QUERY(IMPORTRANGE("LINK_TO_SHEET","Assignments!A2:Q"),"SELECT Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13 WHERE Col1='"&G1&"' AND Col17='Y'",0),""))}
What I want to do is add a single word between the two imported sets of data. It should like kinda like this:
Name
State
City
Blake G.
Arizona
Phoenix
Amy B.
New Mexico
Santa Fe
Inactive
Bill
Texas
Austin
I added the word inactive so the middle looks like ""));"Inactive";ARRAY between the two formulas but because of how Query works I get an error saying the array lengths for each formula do not match. Is there alternative to help make this happen or will I need to figure out a workaround with something that isn't Query?
SUGGESTION
Feel free to comment below if ever your question has been misunderstood.
In my understanding, here's your process:
The first formula will list all data that has N value in Col17 .
The second formula will list all data that has Y value in Col17.
This second formula should also have an Inactive title header.
Merge the two formulas separated by the word "Inactive".
If I got it correctly, you could use the label clause to add "Inactive" in your second Query function as seen on this tweaked formula:
={ARRAYFORMULA(IFNA(QUERY(IMPORTRANGE("SHEET_URL","A1:Q"),"SELECT Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13 WHERE Col1 = '"&G1&"' AND Col17 = 'Y'"),0));ARRAYFORMULA(IFNA(QUERY(IMPORTRANGE("SHEET_URL","A1:Q"),"SELECT Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13 WHERE Col1 = '"&G1&"' AND Col17 = 'N' label Col2 'Inactive'"),0))}
Demo
Sample result.
E.g. If there's new data added that should be under "Inactive".
Main Sheet
John's Sheet
#SputnikDrunk2 is a very good workaround. Just in case you decide to stack different types of ranges that are not queries, you should consider that they need to have the same amount of columns. So if you add a new row it should have the 12 columns you have from your Queries. One way would be like this:
={ARRAYFORMULA(IFNA(QUERY(IMPORTRANGE("LINK_TO_SHEET","Assignments!A2:Q"),"SELECT Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13 WHERE Col1='"&G1&"' AND Col17='N'",0),""));
{"Inactive","","","","","","","","","","",""};
ARRAYFORMULA(IFNA(QUERY(IMPORTRANGE("LINK_TO_SHEET","Assignments!A2:Q"),"SELECT Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13 WHERE Col1='"&G1&"' AND Col17='Y'",0),""))}
Another option to avoid creating so many "","","","" is to use this "trick" that divides a range by 0, and with IFERROR it returns empty cells:
{"Inactive",INDEX (IFERROR(SEQUENCE(1,11)/0,))};
Here's another approach:
=lambda(z,
{filter(choosecols(z,2,3,4,5,6,7,8,9,10,11,12,13),index(z,,1)=A1,index(z,,17)="N");
{"Inactive",makearray(1,11,lambda(r,c,iferror(1/0)))};
filter(choosecols(z,2,3,4,5,6,7,8,9,10,11,12,13),index(z,,1)=A1,index(z,,17)="Y")}
)(A1:Q4)
A1:Q4 part in the formula should be replaced with your importrange Fx
2,3,4,5,6,7,8,9,10,11,12,13 part can also be replaced with shorter sequence(1,12,2,1)

Google Spreadsheet search in a row

I have table that looks like this:
Name Item1 Date Item 2 Date
John Orange 2/8/2020 Apple 8/8/2020
Bob Banana 6/8/2020
I'm trying to find a way to query that table so that it returns me every item the person has and on what date they got it. Some of the problems I have is that there may be more items added over time so columns would expand.
I have looked into queries but it always forces me to select a column, not a row number. I'm really not sure how to pull this off. I also looked into HLookup but the date field really messes with it.
I am open to changing the structure of the data in the spreadsheet if there is a way to allow to accomplish what I need.
try:
=ARRAYFORMULA(IFNA(VLOOKUP(B13, A1:10, COLUMN(B1:1), 0)))
if you want it in a more readable format:
={ARRAY_CONSTRAIN(
FLATTEN(FILTER(IFNA(VLOOKUP(B13, A1:10, COLUMN(B1:1), 0)),
MOD(COLUMN(B1:1), 2)=0)), (COLUMNS(B1:1)-1)/2, 1),
FLATTEN(FILTER(IFNA(VLOOKUP(B13, A1:10, COLUMN(C1:1), 0)),
MOD(COLUMN(C1:1)-1, 2)=0))}

Manual data tagging and lookup

I need a system that allows to filters entries by different text tags.
Say we store info about some products. We have Red Apples, Pears, Watermelons, Cucumbers, Peppers and Bread. We store them in sheet named "Data" in column A. Next columns are occupied by tags, like Red Apples are Red, Sweet, Fruit, Unpacked; Peppers are Red, Spicy, Veggie, Packed; Bread is just Packed.
Then on another sheet we have a dedicated range, say A1:A10, which can accept any data tag, like Spicy or Packed. What I need is when somebody enters Spicy and Packed in this range, it looks up all items that are Spicy and Packed and displays them, so in this case it would display Peppers in B1 cell.
To recap: Data!A:A - entry names, Data!B:Z - tags, Main!A1:A10 - tags entered by user, Main!B:B - entries with tags, that correspond to those entered in A1:A10.
I was trying to use FILTER, but I can't figure out how to select proper condition ranges. I feel like this should be possible within this system and I really don't want to delve into scripting field.
This can be achieved using a helper column to collect all the tags and then a =query() formula.
1)
Start by creating a multi-tag column using either =join() or =textjoin(), capturing all the potential tags for each product.
2)
Then use this answer to help you create the =query() formula needed.
There is a pretty simple solution to this.
You would need to add a helper column and count how many tags does your item has from the listed ones, using this formula
=SUM(ARRAYFORMULA(COUNTIF(B1:1,'Main'!$A$1:$A$10)))
Next, in your presentation sheet reserve some place where you can enter tags - one at a time. In my case, it's range A1:A10. Then just paste this formula anywhere else
=IFERROR(FILTER(Data!$B:$B,Data!$A:$A=(10-COUNTBLANK($A$1:$A$10))),"")
At that place, all suitable elements will show up. I also added sorting to the formula, cause why not.
You can use more tags, for that just increase the tag range and edit formula so when there are no tags entered, COUNTIF gives 0.
if Data sheet looks like this:
and you need "constructive" list, you can do:
=SORT(FILTER(Data!A2:A, REGEXMATCH(TRANSPOSE(QUERY(TRANSPOSE(Data!B2:Z),,999^99)),
TEXTJOIN("|", 1, A1:A10))))
spreadsheet demo
if you need a "destructive" list do:
=ARRAYFORMULA(SORT(QUERY({Data!A2:A, TRANSPOSE(QUERY(TRANSPOSE(Data!B2:Z),,999^99))},
"select Col1 where "&TEXTJOIN(" and ", 1, IF(A1:A10<>"",
"Col2 contains '"&A1:A10&"'", ))&"", 0)))

Extract values from a range with 2 columns only if the value in column 1 contains a specific word in the column 2

I need to extract each individual person from a list that doesn't contain a certain activity (Project). Sounds easy but I can't quite get to the end of it.
Please check the example here on Sheet 2:
https://docs.google.com/spreadsheets/d/1qjbjXFCYj1qXrVVGNnhOj11asxT_o1xHWXerRqAl1UQ/edit#gid=2105763617
Here's the logic.
First I attempted to see if the individual only occurs once and if the Activity is not "Project"
=IF(A2<>"",IF(and(COUNTIF(A:A,A2)=1,B2<>"Project"),0,1),"")
Then I just extract the name that satisfies this criteria:
=query(ARRAYFORMULA(iF(I2:I=0,A2:A,"")), "where Col1 <>'' ")
This works, except there might be multiple assignments for the same person that does not contain the activity "Project" which my formula doesn't account for nor is it a simple dynamic arrayformula.
=UNIQUE(FILTER(A2:A, B2:B<>"Project"))
=UNIQUE(QUERY(A2:B, "select A where B <>'Project'", 0))
=UNIQUE(FILTER(A2:A, B2:B<>"Project",
NOT(REGEXMATCH(A2:A, "^"&TEXTJOIN("$|^", 1, FILTER(A:A, B:B="Project"))&"$"))))
While #player0's answer solves the question, it took a big performance hit on a sheet with >1000 rows.
Instead, I extracted all names that contained "Project" and then all names that did not contain "Project", then subtracted all the names from the first array to eliminate names that were in both.
=UNIQUE(FILTER(UNIQUE(FILTER(A2:A, B2:B<>"Project")), ISNA(MATCH(UNIQUE(FILTER(A2:A, B2:B<>"Project")), UNIQUE(FILTER(A2:A, B2:B="Project")),0))))
You may try this also:
{=IFERROR(INDEX($A$2:A$25,MATCH(0,IF($C$1<>$B$2:$B$25,COUNTIF($F$1:$F1,$A$2:$A$25), ""), 0)),"")}
N.B.
Cell C1 has criteria Project, using cell reference makes the formula
dynamic rather than hard coded.
Enter this formula in cell F2, finish with Ctrl+Shift+Enter,
and fill down.

Is there a way to join multiple vlookups?

I have a spreadsheet I am entering information from a fundraiser in. I have many parts of it done and it seems like what I'm running into should be easier. I have 3 rows set up for each fundraising program, the first row contains a few pieces of incidental information and then a series of dates/times/dollar amounts. I need to search through this range for every dollar amount that came in at, for example, 7:00 am and add them together. I would like this list to come in starting at L1 in the sample sheet and correspond to the list of times in column K.
I will also need to total all the contributions based on a topic which is the cell under the title of the program - but I should be able to figure that out once I move on to it.
A sample sheet is here: https://docs.google.com/spreadsheets/d/1Kg7XhIgzI0o0uIuGg0RTzv7j_bne8pk6DUwSecIXa9E/edit?usp=sharing
I have tried a variety of formulas using ArrayFormula, VLOOKUP, and filter. I've found examples online using each of those functions that seemed like they should work but didn't. One stopped at the first result it came to and another looked like it was creating a list of what it was found in the cell instead of adding them together.
My current unsuccessful code is:
=vlookup(K1, $H$46:$J$164, 2, 0)
This appears as if it is stopping after encountering the first 0. It's definitely not adding in cell I50
I expect the results for 7:00 am to be $406 but I get $0.
paste in L1 cell:
=ARRAYFORMULA(IFERROR(VLOOKUP(TO_TEXT(K1:K35), TO_TEXT(QUERY({
FILTER(H46:I, MOD(ROW(INDIRECT("A4:A"&ROWS(A46:A)+3)), 4)=0);
FILTER(K46:L, MOD(ROW(INDIRECT("A4:A"&ROWS(A46:A)+3)), 4)=0);
FILTER(N46:O, MOD(ROW(INDIRECT("A4:A"&ROWS(A46:A)+3)), 4)=0);
FILTER(Q46:R, MOD(ROW(INDIRECT("A4:A"&ROWS(A46:A)+3)), 4)=0)},
"select Col1,sum(Col2)
where Col1 is not null
group by Col1
label sum(Col2)''", 0)), 2, 0), 0)*1)

Resources