Automatically substitute range names in google sheets - google-sheets

I love the idea of named ranges for making formulas less obscure. However I have yet to find an easy way to actually use them.
E.g. when entering a sum, I normally do
=sum(
then mouse to the blob of stuff I want
then type )
If I want to use a named range, I have to type in the full name manually.
I've tried having the named range sidebar open and clicking on that. Still fills it in column row syntax.
EDIT: New Sheets allows you to click on a range name and it is stored in the formula as a range name.
I've also tried starting to type the name of the range, in hopes that it would try to guess ahead. No joy there either.
Is there a way to automate the use of named ranges? E.g. a script that looks for ranges in your sheet, and compares them to the list of named ranges, and substitutes the named range for the column row syntax?

I don't believe it would be possible, AFAIK, to have the Autocomplete work with named-ranges in that way. To do so, according to GAS documentation one would have to declare a function for each named-range that merely returns its own range, and then call that when wanting to use that range in a function. I believe that GAS prevents the automation of JavaScript code generating other code, so these 'identity' functions would have to be written by hand, somewhat defeating the purpose of adding convenience. I cannot find a link that backs this assumption up, so I apologize for the anecdotal evidence merely based on my experience.
Using the name of namedRanges to conjure up its range is, as of this writing, already baked into Spreadsheets functionality (which I found out at this very moment), so you won't have to have it fill in the A1 range syntax if you'd prefer to use the name itself.
Hope this helps. Cheers!

Related

How to design a system in Google Sheets that allows for people who don't speak the same language to know they're typing the same thing

I admit this is a strange request. Essentially myself and another person who speaks Mandarin need to work on scheduling asynchronously through a spreadsheet. If either of us enters something in, in our respective sections, it should update the other person's section to match. So If I changed Order 1 on Day 1 from Apple to Butter, it should look at the translated text for Butter in Chinese and update the dropdown list entry for Order 1 on Day 1 from Apple to Butter
Unfortunately it doesn't seem like there's anyway to add formulas to dropdown lists. Any advice here?
I created a super simplified spreadsheet of what I'm looking for Spreadsheet
there is a GOOGLETRANSLATE formula:
also, you have DETECTLANGUAGE that outputs the language code:
both of them (DETECTLANGUAGE is able to work with vertical arrays only) are not supported under ARRAYFORMULA so you will need to drag them around. also, it's worth mentioning that formulae are always 1-directional so you can have a dropdown to be translated but that translated output can't be used directly as the input for back-translation creating a paradox. with a scripted solution, you may have more flexibility tho.

How do I get a cell to retain text, after the cell it pulls from changes text?

This question will have two parts. If you're willing to help me out, feel free to address whichever chunk you've got the time or interest for. Thanks in advance.
Assume there are two cells in a spreadsheet, the first (A1) has the text hello inside, and the second (A2) has =T(A1), so they now both say hello. If I want to change the text in A1, but want the text in A2 to continue to read hello, is there a way to automate this?
For some context, this is part of a larger project where I want to create a column of stock tickers that I like. Ideally, I could type the ticker name into a cell, check a box if I want to track it, and it would automatically add itself to a column. Where the first part of this question becomes relevant is that I would then move on to another stock, deleting the first ticker I wrote, but still wanting it in my column.
The second part of the question is about making the column. My instinct would be to use the =ARRAYFORMULA function, but that draws from a column to begin with, so I'm a little bit stuck.
Thanks
answer for Q1:
no, not possible unless you hardcode A2 as:
=T("hello")
or you use a script to remember your value but in that case, the A2 will host a custom function instead of the formula you mentioned
ofc what you are mentioning with those tickers, checkboxes and moving values around it's completely doable with a script
answer for Q2:
it depends on the formulae you use. not all formulas are supported under ARRAYFORMULA

want to name the formula in drop down list

in my original workbook i want to display some values from another sheet for multiple actions.. so i put drop down list for each actions. but when the actions increased i couldn't recognize each formulas. (all of them are import range) so that if i can name each formulas in the drop down then i can recognize fast which action to be performed. here a sample sheet is attached for a solution.. pls take a look. in the dropdown list i included (=a2+b2) instead of that if it displayed as addition in drop down list would be help ful. please take a look.
sorry for my english
Any type of help would be appreciated.
https://docs.google.com/spreadsheets/d/1mpIWyQASMlxRVdlTkv9K1e4oihsrckjT6sD1mLDxvEc/edit#gid=0
If I understand correctly, you want to have a dropdown list menu (from Data Validation) that displays the operation name, but when you click it, it displays just the result.
This is very hacky, but here's a way to create some "labels" in your criteria box:
=IF(;"ADDITION";A2+B2),
=IF(;"SUBTRACTION";A2-B2),
=IF(;"DIVISION";A2/B2),
=IF(;"MULTIPLICATION";A2*B2),
How?(!)
After kicking around some no-op ideas, I finally settled on this as the cleanest and most flexible approach. (By some freak coincidence, it also makes some semantic sense too.) It works because when the first argument to IF is omitted, it defaults to 0 -> FALSE. This effectively makes the second argument to IF a comment/no-op, and always just selects the formula.
Yes, the semicolons are intentional or the parser will think of the args as list items.
Productivity Tip/Footnotes
Sheets will remove any line breaks in your validation criteria, so the formula will be hard to read when you have to edit it. If you anticipate that you'll be adding a bunch of functions later, save the above block in a text file and edit that. Then you can copy+paste it into the validation field.
It will also always show up as "INVALID" because the value will of course never match the formula text.

ARRAYFORMULA with IMPORTRANGE

In column B are listed IDs of Google Sheets. In column C are listed cells, from which I want to import data.
Screenshot of the table
In column D is shown the result of using IMPORTRANGE() by simply dragging it. e.g. for D1 it looks like:
=IMPORTRANGE(B1;C1)
for D2:
=IMPORTRANGE(B2;C2)
and so on.
In column E I want to display the same result but using ARRAYFORMULA that looks like:
=ARRAYFORMULA(IMPORTRANGE(B2:B4,C2:C4))
but the function displays only the data from the first spreadsheet.
People complain about this permissions issue a lot, but it's not hard to solve. What I do is have a sheet which I name "Splash sheet" into which I paste the URLs of the documents I wish to link. To its right is a column headed "permit to connect" which contains IMPORTRANGE formulas importing a single cell from each sheet -- usually a cell containing a confirmation code, number or document name -- on a sheet also named "Splash Sheet." For example,
=IF(B3="enter URL",,CONCATENATE(IMPORTRANGE(B3,"Splash sheet!A1")," ",IMPORTRANGE(B3,"Splash sheet!B1")))
So, when you first connect a spreadsheet via its URL, you get those messages telling you you need to connect, you click the Permit Access, the confirmation code/number/document name appears in the second column, and voilá, your sheets are connected forevermore! Now all your other IMPORTRANGEs referencing that URL will work, and you can use IMPORTRANGE formulas that reference the URL-containing cells on the "splash sheet."
As for the OP's original question, I came here seeking an answer to the same problem, and after more research have realized that we are attempting the impossible here. No way to do this an ARRAYFORMULA. No way around writing formulas that reference every single cell a document's URL may go into.
Problem is you can't make arrays of arrays in spreadsheets; that would involve multiple dimensions, and the medium is inherently two-dimensional. This is what people use databases for.
ARRAYFORMULA doesn't work when importing data (I think it relates to permissions). You could use something like this, =IFERROR(IMPORTRANGE(B5:B7;C5:C7)) and pre-fill the column first, but still there would be the permissions issue. Each new imported sheet needs it's permissions granted by a user.
TLDR: If I understand your intention correctly when you say you would like to see
=ARRAYFORMULA(IMPORTRANGE(B2:B4,C2:C4)), I believe you can make that
happen using the following.
=ARRAYFORMULA(IMPORTRANGE(
INDIRECT(ADDRESS(ROW(B2:B4), COLUMN(B2:B4)),
INDIRECT(ADDRESS(ROW(C2:C4), COLUMN(C2:C4))
)
Breakdown
Use IMPORTRANGE with INDIRECT to create ranges inside ARRAYFORMULA
Call INDIRECT with the ADDRESS function
Call ADDRESS with the ROW and COLUMN functions since they take ranges via ARRAYFORMULA
using IMPORTRANGE with INDIRECT
IMPORTRANGE's two parameters are the spreadsheet url stored in B2:B4 for this example and the range (e.g. sheet!A1:B2) stored in C2:C4.
Since IMPORTRANGE doesn't take a range reference directly as you mentioned, you'll need to build it for each row with ARRAYFORMULA using the INDIRECT function.
INDIRECT can be used to compose a cell reference using A1 notation, for instance
=IMPORTRANGE(INDIRECT("B" & 2), INDIRECT("C" & 2))
will produce the same result as
=IMPORTRANGE(B2, C2)
Since this produces the same result, we now just have to find a way to make INDIRECT work with ARRAYFORMULA
Use ADDRESS to build the parameters for INDIRECT
Next you want to use ADDRESS to build the A1 reference for INDIRECT. For the current purposes, ADDRESS takes a numerical value for row and column as parameters
=INDIRECT(ADDRESS(2,2))
will produce the same result as
=INDIRECT("B" & 2)
Since these two are interchangeable, now we just need to find a way to get the numerical row and column values out of ARRAYFORMULA.
Call ADDRESS using the ROW and COLUMN functions
From there, you can get the row and column indexes from standard A1 notation using the ROW and COLUMN functions. While this may seem like we're pointlessly going in circles, the difference now is that ROW and COLUMN perform as expected with the ranges provided by ARRAYFORMULA. So given that ADDRESS will return $B$2 using using either method below
=ADDRESS(2,2)
or
=ADDRESS(ROW(B2),COLUMN(B2))
we now know that
=ARRAYFORMULA(ADDRESS(ROW(B2:B4),COLUMN(B2:B4)))
will produce the following array of addresses
{ $B$2; $B$3; $B$4 }
Final Assembly
So when we put this all together, we get
=ARRAYFORMULA(IMPORTRANGE(
INDIRECT(ADDRESS(ROW(B2:B4), COLUMN(B2:B4)),
INDIRECT(ADDRESS(ROW(C2:C4), COLUMN(C2:C4))
)
where INDIRECT(ADDRESS(ROW(B2:B4), COLUMN(B2:B4)) is more or less interchangeable with what you might expect from B2:B4 inside ARRAYFORMULA and represents the url parameter
and INDIRECT(ADDRESS(ROW(C2:C4), COLUMN(C2:C4)) is roughly interchangeable with what you might expect from C2:C4 inside ARRAYFORMULA and represents the range parameter.
Suggestions on organization
I recommend using the indentation (Alt +Enter to create a new line ) above along with your indentation of choice to keep it easier to read. In the end it's just a bit more syntactic sugar and if spaces are used well it shouldn't be much harder to understand and make changes to 6 months later.
RE: Permissions - as mentioned by Atiq Zabinski, just placing a simple
IMPORTRANGE("http:/xxxx", "A1") somewhere on the sheet will provide a
means to know if the sheet is connected or not and the error message
should give you a context menu for connecting the sheet. You'll might
want to stay away from error handling in these scenarios as it will
slow down the process of connecting the sheets.

How do I make changes to a named range in google sheets propagate immediately?

I'm using Google Sheets to calculate my goals for weight lifting. Different workouts are based on different percentages of my high score for each lift.
I had been calculating each day's plan with something like "=CEILING((0.8*A3/5), 1)*5" to represent 80% of whatever the hell was in A3, rounded to something divisible by five. This was not maintainable.
What I'm working on now is using the script editor to provide custom functions. "=FIVES('bench')" gives me my bench press progression for five reps.
That works great, except for when I change values. I put a named range on each of my max lifts so I could call getRangeByName get the value by name instead of by cell coordinates. But the functions I made don't get called again so I keep seeing stale values, even after refreshing the page.
I found another post suggesting that getRangeByName had a second arg which could be set to now() to refresh the cache now. Tried that and it looks like that was out of date. I haven't found any other info on a named range being cached.
How can I tell my script that it needs to re-run when a named range gets updated? Is there some sort of observer/listener/watcher in sheets? If not, I'm open to techniques - named ranges were just the first thing I bumped into for naming my variables.
Google's script caching was never going to allow that to work without shenanigans. The expectation is that foo('bar') will be deterministic, always returning the same thing. I'd been passing the named range's name, hoping I could use getRangeByName and using the name as a label.
Instead I'm just using the range as an arg and passing a second string as a label: foo(bar, "Bar label"). It's a little more verbose, but much less so than the stuff I was trying to trick the script server with. Don't fight the framework, folks.

Resources