Обзор среды выполнения V8

В Apps Script и JavaScript среда выполнения или среда выполнения содержит механизм JavaScript, который анализирует и выполняет код сценария. Среда выполнения предоставляет правила доступа к памяти, того, как программа может взаимодействовать с операционной системой компьютера и какой синтаксис программы является допустимым. Каждый веб-браузер имеет среду выполнения JavaScript.

Исторически сложилось так, что Apps Script основан на интерпретаторе Mozilla Rhino JavaScript. Хотя Rhino предоставил Apps Script удобный способ выполнения сценариев разработчика, он также привязал Apps Script к конкретной версии JavaScript ( ES5 ). Разработчики приложений Apps Script не могут использовать более современный синтаксис и функции JavaScript в сценариях, использующих среду выполнения Rhino.

Чтобы решить эту проблему, Apps Script теперь поддерживается средой выполнения V8 , которая поддерживает Chrome и Node.js. Вы можете перенести существующие сценарии в V8 , чтобы воспользоваться преимуществами современного синтаксиса и функций JavaScript.

На этой странице описаны новые функции, доступные в V8, и способы включения V8 для использования в ваших сценариях. В разделе «Миграция сценариев на V8» описаны шаги по переносу существующих сценариев на использование среды выполнения V8.

Особенности среды выполнения V8

Сценарии, использующие среду выполнения V8, могут использовать следующие возможности:

Современный синтаксис ECMAScript

Вы можете использовать современный синтаксис ECMAScript в сценариях, работающих на базе среды выполнения V8. Этот синтаксис включает в себя let , const и многие другие популярные функции.

См. примеры синтаксиса V8 , где приведен краткий список популярных улучшений синтаксиса, которые можно реализовать с помощью среды выполнения V8.

Улучшенное обнаружение функций

Обнаружение функции Apps Script улучшено для сценариев, использующих V8. Новая среда выполнения распознает следующие форматы определения функций:

      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 Sheets:

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 .

Чтобы отобразить журналы Logger и console , в верхней части редактора сценариев нажмите «Журнал выполнения» .

Посмотреть казни

Чтобы просмотреть историю выполнения вашего скрипта, откройте проект Apps Script и слева нажмите «Выполнения .

Примеры синтаксиса V8

Ниже приведен краткий список популярных синтаксических функций, доступных сценариям, использующим среду выполнения V8.

let и const

Ключевые слова 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. Установите флажок Показывать файл манифеста «appsscript.json» в редакторе .
  4. Слева нажмите редактора > appsscript.json .
  5. В файле манифеста appsscript.json установите для поля runtimeVersion значение V8 .
  6. Вверху нажмите проект .

В разделе «Миграция сценариев на версию V8» описаны другие шаги, которые необходимо предпринять, чтобы обеспечить правильную работу сценария с использованием версии 8.

Включение среды выполнения 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. Вверху нажмите проект .

Как перенести существующие скрипты?

В руководстве «Миграция сценариев на версию 8» описаны шаги, которые необходимо предпринять для миграции существующего сценария на использование версии 8. Это включает в себя включение среды выполнения V8 и проверку сценария на наличие известных несовместимостей.

Автоматический перенос скриптов на V8

С 18 февраля 2020 г. Google начнет постепенно переносить существующие скрипты, прошедшие нашу автоматическую проверку совместимости, на версию V8. Затронутые сценарии продолжают нормально работать после миграции.

Если вы хотите отказаться от автоматической миграции сценария, установите для поля runtimeVersion в его манифесте значение DEPRECATED_ES5 . После этого вы можете в любое время вручную перенести сценарий на версию V8 .

Как сообщить об ошибках?

В руководстве поддержки объясняется, как получить помощь по программированию в Stack Overflow, выполнить поиск существующих отчетов о проблемах, зарегистрировать новые ошибки и сделать запросы на новые функции.