I've been working on a script (With some help from folk on SO). I have managed to create a script that imports a csv file and updates named ranges based on the imported data.
Here is an image of what I'm trying to do:
At this point I have imported data which has been populated into columns A:G. The cells in columns H:L are formula and are based on the data in A:G. Because I have imported data the data are now longer than the formula range. If not relying on script I would just double click the small blue square at the bottom right of the highlighted cells and the formulas would copy down. This is what I'd like to have the script do once I have imported the data.
I created a range called "formula_range" which automatically updates with the length of data. "formula_range" starts in cell H3 and ends in L:N where N is the length of rows in the sheet.
"formula_range" therefore contains some populated cells with formula and then blank rows all the way to the bottom of the sheet.
I saw this SO post. So in English, my line of thinking is:
Create a variable formula_range H3:L3 as a range
paste formula_range to every row in formula_range
Voila?
How do I get the variable formula_range if the first row in formula_range will always have the formula to be copied down. Put another way it should be fixed at H3:L3.
I tried this:
var copy_range = ss.getRangeByName("formula_range").getRange(1,5,1);
SpreadsheetApp.getUi().alert(copy_range);
My alert said "undefined" (I really wasn't sure what it would show.)
My line of thinking is not the most efficient since I am going to copy over existing formula. Perhaps there is a better way?
How do I get the first row in a named range formula_range[0]; ?
How can I use script to copy down formula in formula_range?
I think what you're trying to accomplish could be achieved more efficiently with a built-in arrayformula:
https://support.google.com/docs/answer/3093275
Place in H3:
=ARRAYFORMULA(DATE(A3:A,B3:B,1))
for each of your formulas in H through L in row 3 surround them with array formula and extend the arguments with open-ended ranges starting with row 3 as in the above example
Related
I have a very large Google Sheet spreadsheet that I need help with.
I have a long list of Network Switches that are very often repeated that I am trying to automatically copy the associated SKU into a separate adjacent cell.
My goal was, once the SKU is added the first time, whenever the same switch is added again, it will autopopulate with the same SKU.
For instance, C2461:C2463 are repeated, and once K2461 is populated, would like K2462 & K2463 to follow suit.
Any help would be greatly appreciated!
You can try this formula on Column L (col L will serve as a helper column):
=iferror(arrayformula(VLOOKUP(C2:C,C2:K,9,False)),"")
For now I can't seem to fit the formula without the use of a helper column (so I created a separate sheet for now that will serve as a database for the VLOOKUP formula) but this should get you started.
Sample using a helper spreadsheet (Database):
=iferror(arrayformula(VLOOKUP(Database!A2:A,Database!A2:B,2,False)),"")
Output:
PROBLEM: In the below spreadsheet, cells C12:C17 (green) contain text imported from another spreadsheet (The "PARENT").
https://docs.google.com/spreadsheets/d/1brm0dHkXG1vxn2NQ7wGvEoayCdGYKsY4yA-MX4Jtt1w/edit#gid=396314711
Some cells have text. Some are blank. Some contain simple math (i.e 1+1), and others relational math (i.e. A1+B1). The DATA SET in the PARENT sheet are different than the CHILD sheet. I will eventually have to create a lot of CHILD sheets, each with their own unique DATA SET. The formulas on the PARENT sheet will change from time to time, so the solution isn't to just make a copy of the PARENT spreadsheet and turn it into a CHILD sheet.
I need to be able to create the formulas in the PARENT sheet, but when imported into the CHILD sheet, they need to be calculated using the data set on the CHILD sheet.
I'm trying to use a script that will take what is in the C12:C17 range, and make it an active formula in the corresponding D12:D17 cells. If the C column cell is a value, it should just put that value in there instead of making it into a formula.
I've made about a dozen attempts at the setFormulas script. All failed. At this point, I would say I'm "spit-balling", "flailing", and possibly "spiraling". The BEST I've been able to do is to get ONE cell to update (but only if a formula, not text).
I'm looking for a script that will take whatever is in cells C12:C17, and execute/evaluate them into cells D12:D17. If there are text/values in the C cell, then it should put that text/value in the corresponding D cell. If there is a formula in the C cell, it should make it execute in the corresponding D cell. There is no pattern on whether a cell will be a number, text, or formula.
I appreciate any help you can give.
FYI: The formulas/text in the C column were made by importing from the PARENT sheet. That range of cells in the PARENT sheet was made by the following formula:
=IFERROR(FORMULATEXT('P CUSTOMERS'!B12),'P CUSTOMERS'!B12)
Essentially, "If it's a formula, convert it into text. If it's not a formula , just put what is in the cell in the first place ."
I've been working on this for an embarrassing amount of time... (Not hours, not days, not weeks, but MONTHS!).
EDIT / UPDATE:
OK, Marti's scripts worked great in the example file. Moved it to another file, same conditions, and worked again.
THEN, I moved it to another file... Only difference I can tell is that it is MUCH larger.
EDIT SUMMARY:
Ran the script under these conditions.
Made table with formulas. Used FORMULATEXT on that table to convert into text. Imported that range to another sheet. Used an HLOOKUP formula to select which column I wanted to look at formulas for.
In the sample sheet (linked here: https://docs.google.com/spreadsheets/d/1cPSJMXNiKDnHCiUCGJ0iSjaoIiRLQldr1T5rClUUEm0/copy), it works.
But when I run the exact same series of events in another sheet, it fails to do anything. Process is the same, only the range is different. No other scripts on this sheet.
I trimmed down the second sheet so I can share (script still doesn't work).
https://docs.google.com/spreadsheets/d/1RRMy4RtF9CVSXw18bWg79Dh4nwHg8IN3wwhLb3QynvA/edit#gid=236899042
(Note: I can't force a copy, as this sheet requires authorizations from another file)
Here is a video better explaining the issue:
https://drive.google.com/file/d/1pjz_LilRReQlNt7p_4NhU3prtbcAhLah/view?usp=sharing
So, I'm trying to understand why it works in one, but not the other... And just as important, what can I do to make it work in 2nd sheet, which is actual goal.
You can simply use getValues together with setValues. setValues actually interprets values starting with = as formulas, and getValues actually doesn't add the ' before them. So you can simply chain them:
function computeValues() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const s = ss.getSheets()[0]
const src = s.getRange('C12:C')
const target = src.offset(0, 1)
target.setValues(src.getValues())
}
References
Range.getValues() (Apps Script reference)
Range.setValues(values) (Apps Script reference)
Range.offset(rowOffset, columnOffset) (Apps Script reference)
Martà nailed it...
function computeValues() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const s = ss.getSheets()[0]
const src = s.getRange('C12:C')
const target = src.offset(0, 1)
target.setValues(src.getValues())
}
I tested it, as written, by copy/paste. Worked 1st time.
I added in more formulas below the original range, just to see what the limits were (in cell C20), and re-ran it. Still worked.
I would have kept going in my setFormula direction for another few months. Not sure how I got it stuck in my head that was the only solution. This was the final major barrier in my project, and while I still have another few years of manual data entry and formula creation to do, THIS will be the key that makes it all work. THANK YOU!!!
I want to write in the row under the function IMPORTRANGE but when I do that the function stop working bc it cant increase. Can someone know how to solve that pls?
here is my google sheet :
exemple: When i want to write in the row 15 column A,B,C or D the function stop working and I have a REF ERROR but I want to be able to write
The IMPORTRANGE() function occupies a range based on the data that queries. If you add some content within the datarange that importrange returns, the latter will break because it can't expand.
You can either restrict the range that importrange occupies:
=IMPORTRANGE("SprdID";"All Months!$A$1:$D14")
or add content starting from column E. You can also put the importrange function in bottom rows and use the top rows for manually entered data.
Since the raw data could potentially increase in the future, I would advice you to have a dedicated sheet to accommodate the importrange function and all of the other calculations/formulas to be stored in a different sheet.
References:
https://support.google.com/docs/thread/26662291?hl=en
I have a cell value that contains an address. I'd like to cut a portion of that data then edit and paste the results into a separate cell. I don't know the specific language to clearly outline my question so any help would be appreciated. I created annotated images to help.
Original .CSV data I imported into Google Sheets
The data from that import that I would like to extract within the cell.
Data output once I run the Macros script. Original cell data is copy, edited, and pasted into next column.
I have thousands of data entries like this so ideally this script would:
Cut all data starting at 'County:' from Premise Address column.
Paste that data into the County column while removing 'County:'
I ended up using the Split Text to Column function in sheets. Then Find and Replacing the remaining unnecessary text. It's not pretty but it worked.
Gonna dig into REGEXEXTRACT formulae tonight for some fun reading. Thanks!
There are multiple different ways to do this but the simplest would be to use the REGEXEXTRACT formulae; if the data structure is exactly the same across all samples, you could use the following one in the County column -
=IFERROR(REGEXEXTRACT(A2,"County: (.*)"))
Assuming that the first Premise Address is in A2 cell.
INDIRECT() seemed easy for tiny formulas but it didnt seem that easy for the below formula. The reason I want to freeze is whenever I delete the rows in FormResponses, the formula in the second tab is going haywire.
So watevr happens in FormResponses, I want the formula to be rock steady.
=SUM(ArrayFormula(('Form Responses 1'!$B$2:$B=A2)*('Form Responses 1'!$A$2:$A)*(if(offset('Form Responses 1'!$B$2:$B,0,1)="Break Start", -1, 1))))
SAMPLE SHEET _ TAKE COPY
Unfortunately there is no way to lock just the formatting of a sheet or range. If they are locked it will prevent everything from being changed. Best bet for this would be to create a copy of the sheet, format it how you would like, and protect it from everybody.
Then there are a couple of options:
Go to the protected sheet, select all of the cells, and use format painter to copy the format to the working sheet.
Write a script to copy the format of the protected sheet to the working sheet.
Another option would be to write a script to set the format of sheet. This can be setup to happen when the sheet is opened, edited or when you manually run the script.
Or
To keep some of your data in the same place, you can freeze rows and columns:
Open a spreadsheet and select a cell in a row or column you want to freeze .
Open the View menu.
Hover over Freeze.
Select one of the options to freeze up to ten rows, or five columns. You can also choose Up to current row (or Up to current column) to freeze the rows or columns before a cell you've highlighted.