V8 執行階段總覽

在 Apps Script 和 JavaScript 中,執行階段執行階段環境含有 剖析和執行指令碼程式碼的 JavaScript 引擎。執行階段提供了 記憶體存取規則,程式可以如何與 電腦作業系統,以及哪個程式語法合法。每個網站 瀏覽器提供了 JavaScript 的執行階段環境。

Apps Script 一直是由 Mozilla Rhino JavaScript 技術提供 翻譯。儘管 Rhino 提供了 App Script 的簡便執行方式, 開發人員指令碼,也會將 Apps Script 連結至特定的 JavaScript 版本 (ES5)。Apps Script 開發人員 無法在使用 Rhino 的指令碼中使用較新型 JavaScript 語法和功能 執行階段。

為解決這個問題, V8 執行階段,支援 Chrome 和 Node.js。你可以 將現有指令碼遷移至 V8 ,以使用新型 JavaScript 語法和功能。

本頁說明 V8 啟用的新功能及如何啟用 V8 以便用於指令碼 將指令碼遷移至 V8 說明如何遷移現有指令碼以使用 V8 執行階段。

V8 執行階段的功能

使用 V8 執行階段的指令碼可以利用下列優點 功能:

新版 ECMAScript 語法

您可以使用新版 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 記錄,請在指令碼編輯器頂端按一下 執行記錄

查看執行作業

如要查看指令碼的執行記錄,請開啟 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. 勾選「啟用 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. 取消勾選「啟用 Chrome V8 執行階段」核取方塊。

或者,編輯指令碼資訊清單:

  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 的說明、搜尋現有問題報告、回報新錯誤,以及 提出新功能要求