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 サービスにログが書き込まれます。

Loggerconsole のログを表示するには、スクリプト エディタの上部にある [実行ログ] をクリックします。

実行を表示

スクリプトの実行履歴を表示するには、Apps Script プロジェクトを開き、左側の [実行] をクリックします。

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
      

アロー関数

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

// 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 でのプログラミング ヘルプ、既存の問題レポートの検索、新しいバグの報告、新機能リクエストの作成方法について説明しています。