V8 執行階段總覽

在 Apps Script 和 JavaScript 中,執行階段執行階段環境包含用於剖析及執行指令碼的 JavaScript 引擎。執行階段會提供記憶體存取方式、程式與電腦作業系統互動的方式,以及合法的程式語法規則。每個網頁瀏覽器都有 JavaScript 的執行階段環境。

以往,Apps Script 是由 Mozilla 的 Rhino JavaScript 轉譯器提供支援。雖然 Rhino 為 Apps Script 提供了執行開發人員指令碼的便利方式,但也將 Apps Script 與特定 JavaScript 版本 (ES5) 綁定。使用 Rhino 執行階段時,Apps Script 開發人員無法在指令碼中使用較新版的 JavaScript 語法和功能。

為解決這個問題,Apps Script 現已支援由 Chrome 和 Node.js 提供的 V8 執行階段。您可以將現有指令碼遷移至 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 類別。這兩項服務都會將記錄寫入相同的 Stackdriver Logging 服務

如要顯示 Loggerconsole 記錄,請按一下指令碼編輯器頂端的「Execution log」

查看執行作業

如要查看腳本的執行記錄,請開啟 Apps Script 專案,然後按一下左側的「執行」圖示

V8 語法範例

以下列出使用 V8 執行階段的指令碼可用的熱門語法功能。

letconst

letconst 關鍵字可分別定義區塊範圍本機變數和區塊範圍常數。

// 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. 勾選「Enable Chrome V8 runtime」(啟用 Chrome V8 執行階段) 核取方塊。

或者,您也可以直接編輯指令碼資訊清單檔案,指定指令碼執行階段:

  1. 開啟 Apps Script 專案。
  2. 按一下左側的「專案設定」圖示
  3. 勾選「在編輯器中顯示『appsscript.json』資訊清單檔案」核取方塊。
  4. 依序按一下左側的「編輯器」 >「appsscript.json
  5. appsscript.json 資訊清單檔案中,將 runtimeVersion 欄位設為 V8 值。
  6. 按一下頂端的「儲存專案」圖示

將指令碼遷移至 V8 說明您應採取的其他步驟,確保指令碼可順利使用 V8。

啟用 Rhino 執行階段

如果指令碼使用 V8,且您需要切換為使用原始 Rhino 執行階段,請執行下列操作:

  1. 開啟 Apps Script 專案。
  2. 按一下左側的「專案設定」圖示
  3. 取消勾選「Enable Chrome V8 runtime」核取方塊。

或者,您也可以編輯指令碼資訊清單:

  1. 開啟 Apps Script 專案。
  2. 按一下左側的「專案設定」圖示
  3. 勾選「在編輯器中顯示『appsscript.json』資訊清單檔案」核取方塊。
  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 上尋求程式設計相關協助、搜尋現有問題回報、回報新錯誤,以及提出新功能要求。