Google Apps ScriptがV8 Runtimeをサポート

Google Apps Script界隈で結構言われ続けてきた事が「サポートされてるJavaScriptのエンジンが古すぎる」というワードがあります。これまでのGoogle Apps Scriptは非常に古いタイプのJavaScriptをベースにしており、「あれができないこれができない」と言われて来ました。

今回のアップデートでV8 runtimeベースとなり、ES6の多くの構文が使えるようになりました。

図:V8のVはV型8気筒エンジンのV


概要

G Suite の今後のリリースにも、ES2017準拠の環境が開発中という表示がされていましたが、昨日「V8 Runtimeをサポート」というニュースが入ってきました。release noteにも記載されています。

V8 Runtimeサポートに関するドキュメントはこちらになります。Issue Tracker掲載の情報はこちらになります。現在はES6 modules are not yet supported.と書かれているので、Node.jsのようにexportやimportといったものはまだ使えないようです。

HTML Serviceで出力したHTML側は元々使えていたので、これでGAS側もHTML側も同じ構文で開発が可能になりますね。また、JavaScriptでは使えるのに、GASでは使えないので、我慢してたり自分でそれを実現するコードを書いたり非生産的なことが不要になるので、今後のGASの書き方がグッと変わってくると思います。

気になる点が、V8 RuntimeになってGASのスクリプト実行速度に変化があるのだろうか?という点。予てより実行スピードが遅いGASは、速度をアップさせる為に色々と工夫が必要でした。この点が変わっているといいなぁ。

有効にする手順

今回のV8 Runtimeを使うには以下の手順が必要です。本来はスクリプトエディタの「実行」の中に「Chrome V8を搭載した新しいApps Scriptランタイムを有効にする」というものをクリックして有効にすればそのスクリプト内で有効になります。まだ、表示されていない人は手動で変更も可能。無効にするにチェックをすれば元に戻ります。

図:メニューから簡単に切り替えられるよ

手動で変更する場合は以下の手順。詳細はmanifest structureを参照してください。

  1. スクリプトエディタを開く
  2. メニューの「表示」⇒「マニフェストファイルを表示」をクリック
  3. appsscript.jsonを開き、1行以下のようなものをを追加する
  4. 保存すれば、すぐに使えるようになります。
  5. もとに戻す場合には、この行を削除すればオッケーです。(DEPRECATED_ES5を指定しても可)

図:簡単に使えるようになります

注意点

V8にしてから、もとに戻した場合、当たり前ですが互換性が失われているので、スクリプトが動かなくなる可能性があります。また、過去のApps ScriptはECMAScriptの一部の構文が使えていたりしたのですが、これらもV8準拠となるため、使えなくなる可能性があります。

ライブラリやアドオンからの呼び出しなどはすでに対応しており、Logger.logやconsole.logも対応済み。既存のスクリプトをV8準拠のスクリプトにmigrateする場合にはこちらを参照すると良いでしょう。

また、GASの根幹に関わる部分なので、チームで開発をしてる場合、安易にV8構文準拠にしてしまうと、慣れていない他の開発者が読めない、ワケガワカラナイヨとなりやすい(基本VBAのようにエンドユーザ開発が多い為)、自分以外もコードを触る可能性がある場合には、気を使うようにしましょう。

可能になること

極めて端的に言えば

  1. アロー関数が使えるようになります
  2. letやconstが使えるようになりますので、トリッキーな手法が不要になります。
  3. class構文が使えるようになります。
  4. 分割代入が使えるようになります。
  5. テンプレートリテラルが使えるようになります。
  6. 関数のデフォルト引数が使えるようになります。
  7. 複数行に渡る文字列を使えるようになります。
  8. for each文の書き方が変わります
  9. getYear()の仕様がDate.protptype.getFullYear()に変わります。
  10. その他たくさん変更点あり

検証結果

色々と新しい記法やメソッドを検証してみた結果は以下のエントリーにまとめました。

Google Apps ScriptのV8 Runtime対応を検証してみた

関連リンク