6

I'm trying to re-build COUNTIFS as a Google Scripts Custom Function and having trouble with one thing: how do I build a function that accepts an arbitrary number of arguments?

If you use COUNTIFS in google sheets, the inputs look like this:

=COUNTIFS(criteria_range1, criterion1, [criteria_range2, criterion2, ...])

My Google Script can be this:

function COUNTIFS(criteria_range1, criterion1){
    // CountIFS code
}

...but how do I get the optional arguments in my function?

1

2 Answers 2

9

You can reference the arguments object when the number of arguments passed to a function is variable.

Sign up to request clarification or add additional context in comments.

3 Comments

It still only shows the required parameters when I call the function in google docs. Here's where they describe this mechanism: developers.google.com/apps-script/guides/sheets/…
Try for example function numberOfArguments() {return arguments.length;} and call the custom function in a cell with different numbers of arguments.
Oh, if you're referring to the automcomplete information, there isn't a neat way of specifying optional arguments (however you could include that info in the @param description).
4

(Example to support AdamL's answer.)

The autocomplete feature for custom functions abuses jsdoc tags somewhat. The "parameter type" which is normally enclosed in braces, e.g. {String}, is used verbatim in the "Example" section of the function's help, while the parameter name is used in the quick-help.

You can take advantage of this to clarify functions with arbitrary parameters, as shown here.

screenshot

Code

/**
 * Calculate the driving distance along a route.
 *
 * @param {"london","manchester","liverpool"}
 *                   route  Comma separated ordered list of two or more map
 *                          waypoints to include in route. First point
 *                          is 'origin', last is 'destination'.
 *
 * @customfunction
 */
function drivingDistance(route) {
  if (arguments.length < 2) throw new Error( "Must have at least 2 waypoints." )
  var origin = arguments[0];
  var destination = arguments[arguments.length-1];
  ...

2 Comments

Strangely if I put in the same JSdoc code into a script I get different results – rather than "london", "manchester", etc I get Object.
Any idea how to indicate via JSDOC that the custom function accepts an arbitrary amount of arguments? This works in terms of the method being able to work with any amount of args but Google Sheets complains with a error when I pass more than one arg saying "only takes on argument"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.