GASで使えないJavaScript構文

GAS (Google Apps Script) は、JavaScript がベースになっていて、記法や構文も JavaScript と共通のものが多々あります。

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.

とあるように、GAS で使える JavaScript の機能は、JavaScript 1.6 と JavaScript 1.7 から 1.8 の新しい機能です。

ただ、すべての機能を使えるようではないようなので、注意が必要です。

Iterators and generators

Iterators

next: function() { ~ { value: xxx, done: yyy } }

の構文は使うことができます。

Generator functions

function* ~ yield 

の構文を使うと、

関数のパラメータの前に ( がありません。(行 21、ファイル「generator」)

というエラーになり、保存できません。

Array comprehensions

下記の通り obsolete されているようですが、一応調べてみました。

Obsolete since Gecko 58 (Firefox 58 / Thunderbird 58 / SeaMonkey 2.55)
This feature is obsolete. Although it may still work in some browsers, its use is discouraged since it could be removed at any time. Try to avoid using it.

結果、

構文エラー。(行 2、ファイル「arraycomprehensions」)

というエラーになり、保存できません。

代わりに、map() や filter() は、アロー関数を使わなけば動きました。

let statement

ステートメントの前に ; がありません。(行 2、ファイル「let」)

というエラーになり、保存できません。

const statement

動作しましたが、const 変数に代入しても TypeError は発生しませんでした。

代入しても変数の値自体は保護されていて、元の値を保ちます。

Destructuring assignment

[a, b] = [10, 20];

のような Array 要素ごとの代入は動きましたが、

[a, b, ...rest] = [10, 20, 30, 40, 50]

のような Array 要素ををまとめてオブジェクトに代入する記述は

構文エラー。(行 11、ファイル「destructuring assignment」)
となり保存できませんでした。

Expression closures

関数の本文の前に { がありません。(行 3、ファイル「expression closures」)

というエラーになり、保存できません。

Array.prototype.reduce()

アロー関数を使わなければ動きました。

Array.prototype.reduceRight()

アロー関数を使わなけば動きました。

まとめ

GAS 使えない機能や構文を使うと、JavaScript のコードとしては正しいのにうまく動かないので、デバッグが大変になります。

構文エラーで保存できない場合は、GAS で使えない構文なのかを確認してみるとよいでしょう。