What functions do Arrays in Google Apps Script sup

2019-03-08 21:12发布

I keep on finding that Array functions are missing in GAS, eg calling find gives the error: Cannot find function find in object

The only docs I can find on this are somewhat ambiguous: https://developers.google.com/apps-script/guides/services/#basic_javascript_features

Apps Script is based on JavaScript 1.6, plus a few features from 1.7 and 1.8. Many basic JavaScript features are thus available in addition to the built-in and advanced Google services: you can use common objects like Array, Date, RegExp, and so forth, as well as the Math and Object global objects. However, because Apps Script code runs on Google's servers (not client-side, except for HTML-service pages), browser-based features like DOM manipulation or the Window API are not available.

How can I see what exact methods are available on Array?

3条回答
姐就是有狂的资本
2楼-- · 2019-03-08 21:56

When in Doubt, Test Yourself!

Check it out for yourself with:

function es_feature_test(f) {
  var a = [1, 2, 3, 4];

  try {
    a[f].call(a, function () { return true; });
    Logger.log("+ %s", f);
  } catch (e) {
    Logger.log("- %s", f);
  }
}

function es_test() {
  [
    "any",
    "every",
    "fill",
    "filter",
    "find",
    "findIndex",
    "forEach",
    "includes",
    "indexOf",
    "join",
    "keys",
    "lastIndexOf",
    "map",
    "pop",
    "push",
    "reduce",
    "reduceRight",
    "reverse",
    "shift",
    "slice",
    "some",
    "sort",
    "splice"
  ].forEach(function (fName) {
    es_feature_test(fName);
  });
}

Note: this function list is not exhaustive and is only for example purposes.

Which outputs something like:

[16-09-05 14:48:38:843 CEST] - any
[16-09-05 14:48:38:843 CEST] + every
[16-09-05 14:48:38:844 CEST] - fill
[16-09-05 14:48:38:844 CEST] + filter
[16-09-05 14:48:38:845 CEST] - find
[16-09-05 14:48:38:846 CEST] - findIndex
[16-09-05 14:48:38:846 CEST] + forEach
[16-09-05 14:48:38:847 CEST] - includes
[16-09-05 14:48:38:847 CEST] + indexOf
[16-09-05 14:48:38:848 CEST] + join
[16-09-05 14:48:38:848 CEST] - keys
[16-09-05 14:48:38:849 CEST] + lastIndexOf
[16-09-05 14:48:38:849 CEST] + map
[16-09-05 14:48:38:850 CEST] + pop
[16-09-05 14:48:38:850 CEST] + push
[16-09-05 14:48:38:851 CEST] + reduce
[16-09-05 14:48:38:851 CEST] + reduceRight
[16-09-05 14:48:38:851 CEST] + reverse
[16-09-05 14:48:38:852 CEST] + shift
[16-09-05 14:48:38:852 CEST] + slice
[16-09-05 14:48:38:853 CEST] + some
[16-09-05 14:48:38:853 CEST] + sort
[16-09-05 14:48:38:854 CEST] + splice

Alternatively, robd's method works fine too, except it only tells you the list of methods that are visible. It doesn't tell you:

  • whether they actually work (they could block on access),
  • which methods are not visible.

So I prefer my slightly more explicit approach.

An even better method than mine would be to actually check function test cases to make sure behaviors are correct, but... oh well...

GAS Function Call Support Fun Fact

Here's something weird: I first tested using an implementation with .apply() instead of .call() (out of habit), and strangely enough only the methods supported in the GAS editor appeared as supported. Works fine using .call() though. Rather odd.

I Want my Functional Tools Back!

Check out underscoreGS.

查看更多
The star\"
3楼-- · 2019-03-08 21:58

Besides robd's answer there is also the 2d arrays library.
According to the picture (but not the documentation) that one has a find function

查看更多
Evening l夕情丶
4楼-- · 2019-03-08 22:00

Logger.log(Object.getOwnPropertyNames(Array.prototype)) gives the following, which I think it is the correct list:

[constructor, toString, toLocaleString, toSource, join, reverse, sort, push, pop, shift, unshift, splice, concat, slice, indexOf, lastIndexOf, every, filter, forEach, map, some, reduce, reduceRight, length]

查看更多
登录 后发表回答