V8 ランタイムの概要

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Apps Script と JavaScript では、ランタイム環境スクリプト コードを解析し、実行する JavaScript エンジンが含まれます。このランタイムは、メモリへのアクセス方法、プログラムとパソコンのオペレーティング システムとの連携方法、有効なプログラム構文を規定します。各ウェブブラウザには、JavaScript のランタイム環境があります。

これまで、Apps Script は Mozilla の Rhino JavaScript インタープリタで動作していました。Rhino は Apps Script でデベロッパー スクリプトを実行する便利な方法を提供しましたが、Apps Script を特定の JavaScript バージョン(ES5)と結びつけました。Apps Script デベロッパーは、Rhino ランタイムを使用するスクリプトで最新の JavaScript 構文や機能を使用することはできません。

この問題に対処するため、Chrome と Node.js に搭載されている V8 ランタイムで Apps Script がサポートされるようになりました。既存のスクリプトを V8 に移行すると、最新の JavaScript 構文と機能を利用できます。

このページでは、V8 で有効になる新機能と、スクリプトで V8 を有効にする方法について説明します。V8 スクリプトへのスクリプトの移行では、V8 ランタイムを使用するように既存のスクリプトを移行する手順について説明しています。

V8 ランタイムの特長

V8 ランタイムを使用するスクリプトでは、次の機能を利用できます。

最新の ECMAScript 構文

V8 ランタイムのスクリプトでは、最新の ECMAScript 構文を使用できます。この構文には、letconst など、多くの一般的な機能が含まれます。

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 を使用するスクリプトでは、すでにライブラリ メソッドを呼び出すことができる場所から、オブジェクト メソッドやクラスの静的メソッドを呼び出すことができます。次のような場所が表示されます。

次の V8 の例では、Google スプレッドシートでメニュー項目を作成するときにオブジェクト メソッドを使用しています。

function onOpen() {
  var 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();
}

var 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 プロジェクトを開き、左側の [Executions] をクリックします。

V8 の構文例

V8 ランタイムを使用してスクリプトで使用できる一般的な構文機能のリストは次のとおりです。

letconst

let キーワードと const キーワードを使用すると、それぞれブロック スコープのローカル変数とブロック スコープ定数を定義できます。

// V8 runtime
let s = "hello";
if (s === "hello") {
  let s = "world";
  console.log(s);  // Prints "world"
}
console.log(s);  // Prints "hello"

const N = 100;
N = 5; // Results in TypeError
      

Arrows 関数

アロー関数は、式内で関数を定義するコンパクトな方法を提供します。

// 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 array = [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
var data = {a: 12, b: false, c: 'blue'};
var {a, c} = data;
console.log(a, c);  // Outputs 12 "blue"


var array = [1, 2, 3];
var [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
var name = `Hi ${first} ${last}.`;
var 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
var 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
var multiline = `This on the other hand,
actually is a multi-line string,
thanks to JavaScript ES6`;
      

V8 ランタイムの有効化

スクリプトが Rhino ランタイムを使用している場合は、次の手順で V8 に切り替えることができます。

  1. Apps Script プロジェクトを開きます。
  2. 左側にあるプロジェクト設定アイコン をクリックします。
  3. [Chrome V8 ランタイムを有効にする] チェックボックスをオンにします。

または、スクリプト マニフェストを編集して、スクリプト ランタイムを直接指定することもできます。

  1. Apps Script プロジェクトを開きます。
  2. 左側にあるプロジェクト設定アイコン をクリックします。
  3. [Show "appsscript.json" manifest file in editor] チェックボックスをオンにします。
  4. 左側の [エディタ] > [appsscript.json] をクリックします。
  5. appsscript.json マニフェスト ファイルで、runtimeVersion フィールドの値を V8 に設定します。
  6. 上部の [プロジェクトを保存] をクリックします。

V8 へのスクリプトの移行では、V8 を使用してスクリプトを正常に機能させるためのその他の手順について説明しています。

Rhino ランタイムを有効にする

スクリプトが V8 を使用していて、元の Rhino ランタイムを使用するように切り替える必要がある場合は、次の手順を行います。

  1. Apps Script プロジェクトを開きます。
  2. 左側にあるプロジェクト設定アイコン をクリックします。
  3. [Chrome V8 ランタイムを有効にする] チェックボックスをオフにします。

または、スクリプト マニフェストを編集します。

  1. Apps Script プロジェクトを開きます。
  2. 左側にあるプロジェクト設定アイコン をクリックします。
  3. [Show "appsscript.json" manifest file in editor] チェックボックスをオンにします。
  4. 左側の [エディタ] > [appsscript.json] をクリックします。
  5. appsscript.json マニフェスト ファイルで、runtimeVersion フィールドの値を DEPRECATED_ES5 に設定します。
  6. 上部の [プロジェクトを保存] をクリックします。

既存のスクリプトを移行するにはどうすればよいですか?

V8 スクリプトへの移行ガイドでは、V8 を使用するために既存のスクリプトを移行するために必要な手順について説明しています。そのためには、V8 ランタイムを有効にして、既知の非互換性がないかスクリプトをチェックする必要があります。

スクリプトの V8 への自動移行

2020 年 2 月 18 日以降、Google は自動互換性テストに合格した既存のスクリプトを V8 に段階的に移行します。影響を受けるスクリプトは、移行後も通常どおり機能します。

スクリプトの自動移行を無効にするには、マニフェストの runtimeVersion フィールドを DEPRECATED_ES5 に設定します。その後は、いつでも手動でスクリプトを V8 に移行できます。

バグを報告するにはどうすればよいですか?

サポートガイドでは、Stack Overflow のプログラミングに関するサポートを利用する、既存の問題レポートを検索する、新しいバグを報告する、新機能をリクエストする方法について説明しています。