I have made a simple user form to retrieve user info and add this to a database. The script finds the last row and adds the data to a new row, in columns A to E. The columns F to O have formulas. To prevent to user pulling down the formulas manually, I used arrayformula. Which works fine, but together with the data from the user form it does not. When looking for the last row, the script sees the arrayformula as data and makes the new row at the end of the array. How do I prevent this? I have checked the cells, there is no value in them. It works fine when I manually pull down the formulas.
This is the format I'm using. I put in a if-test to prevent zero's from showing on the sheet.
=arrayformula(if(C8:C="","",C8:C*H8:H))
change this:
=arrayformula(if(C8:C="","",C8:C*H8:H))
to this:
=arrayformula(if(C8:C="",,C8:C*H8:H))
then run the script again.
"" is not truly empty to a script, only to the eye.
Related
I'm trying to work on a Google Sheet and make it as user friendly as possible, so when I'm not around others can't screw it up. I have previously copied the formula down the column, but I'm trying to do it in an array formula, that is in the header of the column so people don't need to copy the formula to other cells.
The formula is simply a VLOOKUP, comparing a cell to the left with the code, and retrieving the title and other information later. (I've had this working happily via copying the formula down the column.)
VLOOKUP($F$2:F, 'Lessons NEW'!$E$2:$F,2,false)
My problem comes when trying to do this using an array formula in the header. This also works properly, but doesn't allow me to do somethings needed.
={"Title";
ARRAYFORMULA(
IF($F2:$F<>"",
VLOOKUP($F$2:F, 'Lessons NEW'!$E$2:$F,2,false),
)
)}
Again this works happily.
HOWEVER. my issue is that on some rows I need to manually enter some info.
What I want to happen, is rows in the column that have data, in the array formula's destination to get skipped over and simply ignored during the array formula's output and end up containing what's been manually entered in them. (Some rows in the column will just be random manual entry stuff)
I've tried doing this via checking if there is a code in the cell to the left, and try to make it skip if so, or check if the destination cell has contents already and skip if so. but it seems that if I have anything in the output area of the array formula, it breaks it completely.
Does anyone have any suggestions of how I can accomplish this? Thanks!
Unfortunately there's no direct solution within ARRAYFORMULA. If you can, and ideally there are no in between rows added, you can add a column to the left to be hidden, and contain the formula adapted:
={"",VLOOKUP($F2, 'Lessons NEW'!$E$2:$F,2,false)}
Without ARRAYFORMULA it will be able to expand at any row that doesn't have a handwritten value. You may also protect that whole hidden column (that will mean also that no in between rows will be added by noon authorised people, may be also useful for you)
UPDATE
Sample script for copying the formula. Adapt the ranges and name of the sheet:
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
SpreadsheetApp.getUi().createMenu("Custom")
.addItem("Copy Formula","copyformula")
.addToUi()
copyformula()
}
function copyformula(){
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sh = ss.getSheetByName("Sheet3")
var range = sh.getRange("D1")
range.copyTo(sh.getRange("D2:D"))
}
what you describe contradicts the intended usage of arrayformula. arrayformula is designed to roll out and for that, it needs an empty space. any manual input in that empty space will render the arrayformula out of the game. there are only two solutions for your issue:
not use arrayformula but VLOOKUP formula in every cell
use a script that will inject the formula only if there is no manual input
and one more hybrid solution - have your arrayformula in one column and your manual input in the next column, and then have 3rd column that will gather the data like if manual column is empty output vlookup otherwise output manual input
In a google sheet linked with a google form, I am putting
=ARRAYFORMULA(Responses!$A$2:R500)
in a blank sheet(namely dataList) to copy raw data from the response sheet so it is more readable and manageable.
After submitting some test data, I need to clear them and publish the form for production use. If I simply select the rows and hit "delete" on my keyboard, when new submission comes in, it will not appear on the first row(or row 2), instead it remembers how many rows there were and put the new data on the next row, thus leaving the first rows blank on both of the sheets, which is unacceptable. So I select the rows with test data in the sheet Response and delete the rows:
Now when new submission comes in, it does appear on row 2 in Sheet Response; however, when I go to my "dataList" sheet, it is like this
The A1 notation which is supposed to be absolute has been altered, hence my dataList sheet doesn't get the new submission data from sheet Response.
How to deal with this unwanted behavior?
you can freeze it like:
=INDIRECT("Responses!A2:R500")
instead of your:
=ARRAYFORMULA(Responses!$A$2:R500)
If you want to avoid string ranges or INDIRECT, you could use INDEX:
=INDEX(Responses!A:A,2):INDEX(Responses!R:R,500)
This always takes the second row from A:A and 500th row of R:R regardless of the deleted rows.
Advantage:
This can be drag filled. It can change based only on certain conditions.
I have a sheet that is attached to a form on my website. It's using gravity forms for wordpress. Not sure what changed, but now every time a new submission comes in from the form it makes the formulas change on other sheets. I've done the $ signs in the formulas but it's still changing. The formulas are based off of the response sheet capturing all the answers.
How can I lock the formulas so they don't change every time a new response comes in? I want it always pulling from A2, even when new responses come in. I've seen the "Indirect" formula suggestion but my formulas are already complex. Here's one:
=ArrayFormula(vlookup(transpose(split(query(rept(row(Sheet1!$A$2:A)&" ",Sheet1!$B$2:B),,9^9)," ")),ArrayFormula({row(Sheet1!$A$2:A),Sheet1!$A$2:R}),{2,19},0))
This formula works perfectly, and once I change it all back to A2 after the first response comes in it works fine... but I make a new sheet with every form and I also reset the sheets when I turn forms on and off. I would like to not have to change it every time a first response comes in for every sheet. Any suggestions?
use in row 1:
={"header"; INDEX(IFNA(VLOOKUP(TRANSPOSE(SPLIT(
QUERY(REPT(ROW(Sheet1!A2:A)&"", Sheet1!B2:B),,9^9), " ")),
{ROW(Sheet1!A2:A), Sheet1!A2:R}, {2,19}, ))}
Form responses are always inserted in newly created rows that cannot be referenced directly in advance.
The usual recipe to work around this is to dynamically copy form responses to another sheet where the values can be referenced normally. To do this, choose Insert > New sheet and place this formula in cell A1 of the new sheet:
={ 'Form Responses 1'!A1:F }
...where F corresponds with the last form responses column that you want to copy.
Then modify your formulas to reference the new sheet instead of the form responses sheet.
I'm looking for a solution to a problem that seems minor at first, but if you end up having spreadsheets with 1000's of rows, it involves a lot of dragging. I need an autofill for a formula for a column that pulls information from the first sheet.
Here is what I have so far.
=if(SUMPRODUCT(--(Magento!A2:A<>""))=0,"",Magento!A2)
I suppose I could do the same thing with =(Magento!A2).. but I was trying to get it to detect and auto-fill based on what is input into the first sheet.
Basically, if there are 29 SKUs in the first sheet which is the master, I'd like it to populate the information in the second sheet. At the same time if there ended up being 2000 skus on the first sheet, I'd like the 2000 skus to be populated on the second sheet column A without having to drag and drag the autofill.
It sounds to me like you just want to bring in a copy of whatever is in Magento!A2:A, exchanging any zeros for nulls. If that is the case:
=ArrayFormula(IF(Magento!A2:A=0,,Magento!A2:A))
If that isn't what you had in mind, please share a direct link to your sheet (or a copy of it), using File > Share.
Addendum (after comment clarification)
You just needed this:
=ArrayFormula(Magento!A2:A)
Basically the title says it pretty well. I have a query I want to run that will continue to stack results of an ongoing event, each new event having the creation of a new sheet within this on Google Sheet.
The helper columns essentially act to concatenate the separate parts of the sheet names with the appropriate referenced cells.
My problem comes in when I try to use query and reference the populated cell as the range. I don't want Query to Query the CELL I am referencing, I want it to Query the TEXT that that cell contains. Does that make sense?
When I copy and paste the VALUE from O4, and then copy that value and paste it into the QUERY formula, it works as intended.
There is a script function "getSheetnames()" in cell E2, not sure if you need to know that to inspect the sheet.
I have gone around and around and tried every version of googling that I can think of, but all I keep finding is how to dynamically change the "query" part of the query, not the "data" part.
Here's the sheet (the tab in question is HELPER):
https://docs.google.com/spreadsheets/d/1n-fwDkeS5gtkXhPZZNszZs2_AlBeMN_2-5zo3sbUGho/edit?usp=sharing