Apps Script と JavaScript では、ランタイムまたはランタイム環境に、スクリプト コードを解析して実行する JavaScript エンジンが含まれています。ランタイムは、メモリへのアクセス方法、プログラムがコンピュータのオペレーティング システムとやり取りする方法、有効なプログラム構文に関するルールを提供します。各ウェブブラウザには、JavaScript のランタイム環境があります。
これまで、Apps Script は Mozilla の Rhino JavaScript インタープリタによって動作していました。Rhino は、Apps Script がデベロッパー スクリプトを実行する便利な方法を提供しましたが、Apps Script を特定の JavaScript バージョン(ES5)に結び付けるものでもありました。Apps Script デベロッパーは、Rhino ランタイムを使用するスクリプトで、より新しい JavaScript の構文や機能を使用できません。
この懸念に対処するため、Apps Script は Chrome と Node.js を搭載する V8 ランタイムでサポートされるようになりました。最新の JavaScript 構文と機能を利用するには、既存のスクリプトを V8 に移行します。
このページでは、V8 によって有効になる新機能と、スクリプトで使用するために V8 を有効にする方法について説明します。V8 へのスクリプトの移行では、既存のスクリプトを移行して V8 ランタイムを使用する手順について説明します。
V8 ランタイムの機能
V8 ランタイムを使用するスクリプトでは、次の機能を利用できます。
最新の ECMAScript 構文
V8 ランタイムを搭載したスクリプトで、最新の ECMAScript 構文を使用できます。この構文には、let
、const
など、多くの一般的な機能が含まれています。
V8 ランタイムを使用して行うことができる一般的な構文の改善の簡単なリストについては、V8 構文の例をご覧ください。
関数検出の改善
V8 を使用するスクリプトの Apps Script 関数の検出が改善されました。新しいランタイムは、次の関数定義形式を認識します。
function normalFunction() {} async function asyncFunction() {} function* generatorFunction() {} var varFunction = function() {} let letFunction = function() {} const constFunction = function() {} var namedVarFunction = function alternateNameVarFunction() {} let namedLetFunction = function alternateNameLetFunction() {} const namedConstFunction = function alternateNameConstFunction() {} var varAsyncFunction = async function() {} let letAsyncFunction = async function() {} const constAsyncFunction = async function() {} var namedVarAsyncFunction = async function alternateNameVarAsyncFunction() {} let namedLetAsyncFunction = async function alternateNameLetAsyncFunction() {} const namedConstAsyncFunction = async function alternateNameConstAsyncFunction() {} var varGeneratorFunction = function*() {} let letGeneratorFunction = function*() {} const constGeneratorFunction = function*() {} var namedVarGeneratorFunction = function* alternateNameVarGeneratorFunction() {} let namedLetGeneratorFunction = function* alternateNameLetGeneratorFunction() {} const namedConstGeneratorFunction = function* alternateNameConstGeneratorFunction() {} var varLambda = () => {} let letLambda = () => {} const constLambda = () => {} var varAsyncLambda = async () => {} let letAsyncLambda = async () => {} const constAsyncLambda = async () => {}
トリガーとコールバックからオブジェクト メソッドを呼び出す
V8 を使用するスクリプトは、ライブラリ メソッドを呼び出すことができる場所から、オブジェクト メソッドとクラスの静的メソッドを呼び出すことができます。これらの場所には、次のようなものがあります。
- Google Workspace アドオンのマニフェスト トリガー
- インストール可能なトリガー
- Google Workspace エディタのメニュー項目
ScriptApp.newStateToken()
コードサンプルで説明されているような、ユーザー コールバック関数。
次の V8 の例は、Google スプレッドシートでメニュー項目を作成する際のオブジェクト メソッドの使用方法を示しています。
function onOpen() {
const ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
ui.createMenu('Custom Menu')
.addItem('First item', 'menu.item1')
.addSeparator()
.addSubMenu(ui.createMenu('Sub-menu')
.addItem('Second item', 'menu.item2'))
.addToUi();
}
const menu = {
item1: function() {
SpreadsheetApp.getUi().alert('You clicked: First item');
},
item2: function() {
SpreadsheetApp.getUi().alert('You clicked: Second item');
}
}
ログを表示
Apps Script には、Logger
サービスと console
クラスの 2 つのロギング サービスがあります。これらのサービスはどちらも、同じ Stackdriver Logging サービスにログを書き込みます。
Logger
ログと console
ログを表示するには、スクリプト エディタの上部にある [実行ログ] をクリックします。
実行を表示する
スクリプトの実行履歴を表示するには、Apps Script プロジェクトを開き、左側の [実行]
をクリックします。V8 構文の例
V8 ランタイムを使用するスクリプトで使用できる一般的な構文機能の簡単なリストを次に示します。
let
、const
let
キーワードと const
キーワードを使用すると、それぞれブロック スコープのローカル変数とブロック スコープの定数を定義できます。
// V8 runtime let s = "hello"; if (s === "hello") { s = "world"; console.log(s); // Prints "world" } console.log(s); // Prints "hello" const N = 100; N = 5; // Results in TypeError |
アロー関数
アロー関数を使用すると、式内で関数を簡潔に定義できます。
// Rhino runtime function square(x) { return x * x; } console.log(square(5)); // Outputs 25 |
// V8 runtime const square = x => x * x; console.log(square(5)); // Outputs 25 // Outputs [1, 4, 9] console.log([1, 2, 3].map(x => x * x)); |
クラス
クラスは、継承を使用してコードを概念的に整理する手段を提供します。V8 のクラスは、主に JavaScript のプロトタイプ ベースの継承に対する構文糖衣です。
// V8 runtime class Rectangle { constructor(width, height) { // class constructor this.width = width; this.height = height; } logToConsole() { // class method console.log(`Rectangle(width=${this.width}, height=${this.height})`); } } const r = new Rectangle(10, 20); r.logToConsole(); // Outputs Rectangle(width=10, height=20) |
分割代入
分割代入式は、配列やオブジェクトから個別の変数に値をすばやく取り出す方法です。
// Rhino runtime var data = {a: 12, b: false, c: 'blue'}; var a = data.a; var c = data.c; console.log(a, c); // Outputs 12 "blue" var a = [1, 2, 3]; var x = a[0]; var y = a[1]; var z = a[2]; console.log(x, y, z); // Outputs 1 2 3 |
// V8 runtime const data = {a: 12, b: false, c: 'blue'}; const {a, c} = data; console.log(a, c); // Outputs 12 "blue" const array = [1, 2, 3]; const [x, y, z] = array; console.log(x, y, z); // Outputs 1 2 3 |
テンプレート リテラル
テンプレート リテラルは、式を埋め込むことができる文字列リテラルです。これにより、より複雑な文字列連結ステートメントを回避できます。
// Rhino runtime var name = 'Hi ' + first + ' ' + last + '.'; var url = 'http://localhost:3000/api/messages/' + id; |
// V8 runtime const name = `Hi ${first} ${last}.`; const url = `http://localhost:3000/api/messages/${id}`; |
デフォルトのパラメータ
デフォルト パラメータを使用すると、関数宣言で関数パラメータのデフォルト値を指定できます。これにより、欠落しているパラメータにデフォルト値を明示的に割り当てる必要がなくなるため、関数本体のコードを簡素化できます。
// Rhino runtime function hello(greeting, name) { greeting = greeting || "hello"; name = name || "world"; console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
// V8 runtime const hello = function(greeting="hello", name="world") { console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
複数行の文字列
テンプレート リテラルと同じ構文を使用して、複数行の文字列を定義できます。テンプレート リテラルと同様に、この構文を使用すると、文字列の連結を回避して文字列の定義を簡素化できます。
// Rhino runtime var multiline = "This string is sort of\n" + "like a multi-line string,\n" + "but it's not really one."; |
// V8 runtime const multiline = `This on the other hand, actually is a multi-line string, thanks to JavaScript ES6`; |
V8 ランタイムを有効にする
スクリプトで Rhino ランタイムを使用している場合は、次の手順で V8 に切り替えることができます。
- Apps Script プロジェクトを開きます。
- 左側の [プロジェクト設定] をクリックします。
- [Chrome V8 ランタイムを有効にする] チェックボックスをオンにします。
または、スクリプト マニフェストを編集して、スクリプトのランタイムを直接指定することもできます。
- Apps Script プロジェクトを開きます。
- 左側の [プロジェクト設定] をクリックします。
- [「appsscript.json」マニフェスト ファイルをエディタで表示する] チェックボックスをオンにします。
- 左側で、[エディタ]
appsscript.json
] をクリックします。
> [ appsscript.json
マニフェスト ファイルで、runtimeVersion
フィールドを値V8
に設定します。- 上部の [プロジェクトを保存] をクリックします。
スクリプトを V8 に移行するでは、スクリプトが V8 で適切に機能するようにするために行うべきその他の手順について説明しています。
Rhino ランタイムを有効にする
スクリプトで V8 を使用しており、元の Rhino ランタイムを使用するように切り替える必要がある場合は、次の操作を行います。
- Apps Script プロジェクトを開きます。
- 左側の [プロジェクト設定] をクリックします。
- [Chrome V8 ランタイムを有効にする] チェックボックスをオフにします。
または、スクリプト マニフェストを編集します。
- Apps Script プロジェクトを開きます。
- 左側の [プロジェクト設定] をクリックします。
- [「appsscript.json」マニフェスト ファイルをエディタで表示する] チェックボックスをオンにします。
- 左側で、[エディタ]
appsscript.json
] をクリックします。
> [ appsscript.json
マニフェスト ファイルで、runtimeVersion
フィールドを値DEPRECATED_ES5
に設定します。- 上部の [プロジェクトを保存] をクリックします。
既存のスクリプトを移行するにはどうすればよいですか?
V8 へのスクリプトの移行ガイドでは、既存のスクリプトを移行して V8 を使用するために必要な手順について説明しています。これには、V8 ランタイムを有効にして、既知の非互換性がないかスクリプトを確認することが含まれます。
スクリプトの V8 への自動移行
2020 年 2 月 18 日より、Google は自動互換性テストに合格した既存のスクリプトを V8 に段階的に移行します。移行後も、影響を受けるスクリプトは引き続き正常に機能します。
スクリプトを自動移行から除外する場合は、マニフェストの runtimeVersion
フィールドを DEPRECATED_ES5
に設定します。その後、いつでも手動でスクリプトを V8 に移行できます。
バグを報告するにはどうすればよいですか?
サポートガイドでは、Stack Overflow でプログラミングのヘルプを利用する方法、既存の問題レポートを検索する方法、新しいバグを報告する方法、新機能のリクエストを行う方法について説明しています。