В Apps Script и JavaScript среда выполнения ( runtime ) содержит движок JavaScript, который анализирует и выполняет код скрипта. Среда выполнения определяет правила доступа к памяти, взаимодействия программы с операционной системой компьютера и допустимый синтаксис программы. В каждом веб-браузере есть среда выполнения для JavaScript.
Исторически Apps Script работал на основе интерпретатора JavaScript Rhino от Mozilla. Хотя 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
В скриптах, работающих под управлением среды выполнения V8, можно использовать современный синтаксис ECMAScript . Этот синтаксис включает 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, могут вызывать методы объектов и статические методы классов из мест, где уже можно вызывать библиотечные методы. К таким местам относятся:
- Триггеры манифеста дополнений Google Workspace
- Устанавливаемые триггеры
- Пункты меню в Google Workspace редакторы
- Пользовательские функции обратного вызова, такие как описанная в примере кода
ScriptApp.newStateToken()
.
В следующем примере V8 показано использование методов объектов при построении пунктов меню в Google Таблицах:
function onOpen() {
const 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();
}
const 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 и слева нажмите Executions
.Примеры синтаксиса V8
Ниже приведен краткий список популярных синтаксических функций, доступных скриптам, использующим среду выполнения V8.
let
и const
Ключевые слова let
и const
позволяют определять локальные переменные области действия блока и константы области действия блока соответственно.
// V8 runtime let s = "hello"; if (s === "hello") { 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 a = [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 const data = {a: 12, b: false, c: 'blue'}; const {a, c} = data; console.log(a, c); // Outputs 12 "blue" const array = [1, 2, 3]; const [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 const name = `Hi ${first} ${last}.`; const 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 const 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 const multiline = `This on the other hand, actually is a multi-line string, thanks to JavaScript ES6`; |
Включение среды выполнения V8
Если скрипт использует среду выполнения Rhino, вы можете переключить его на V8, выполнив следующие действия:
- Откройте проект Apps Script.
- Слева нажмите проекта .
- Установите флажок Включить среду выполнения Chrome V8 .
В качестве альтернативы вы можете указать время выполнения скрипта напрямую, отредактировав файл манифеста скрипта :
- Откройте проект Apps Script.
- Слева нажмите проекта .
- Установите флажок Показывать файл манифеста «appsscript.json» в редакторе .
- Слева нажмите Редактор
appsscript.json
. > - В файле манифеста
appsscript.json
задайте для поляruntimeVersion
значениеV8
. - В верхней части нажмите Сохранить проект .
В разделе «Перенос скриптов в V8» объясняются другие шаги, которые следует предпринять для обеспечения корректной работы скрипта при использовании V8.
Включение среды выполнения Rhino
Если ваш скрипт использует V8 и вам необходимо переключить его на использование оригинальной среды выполнения Rhino, выполните следующие действия:
- Откройте проект Apps Script.
- Слева нажмите проекта .
- Снимите флажок Включить среду выполнения Chrome V8 .
В качестве альтернативы отредактируйте манифест скрипта:
- Откройте проект Apps Script.
- Слева нажмите проекта .
- Установите флажок Показывать файл манифеста «appsscript.json» в редакторе .
- Слева нажмите Редактор
appsscript.json
. > - В файле манифеста
appsscript.json
задайте для поляruntimeVersion
значениеDEPRECATED_ES5
. - В верхней части нажмите Сохранить проект .
Как перенести существующие скрипты?
В руководстве «Миграция скриптов в V8» описываются шаги, необходимые для миграции существующего скрипта для использования V8. Это включает в себя включение среды выполнения V8 и проверку скрипта на наличие известных несовместимостей.
Автоматическая миграция скриптов в V8
С 18 февраля 2020 года Google начнёт постепенный перенос существующих скриптов, прошедших автоматизированный тест на совместимость, на версию V8. Затронутые скрипты продолжат работать в штатном режиме после переноса.
Если вы хотите отключить автоматическую миграцию скрипта, установите для поля runtimeVersion
в его манифесте значение DEPRECATED_ES5
. После этого вы сможете вручную перенести скрипт в V8 в любое время.
Как сообщить об ошибках?
В руководстве по поддержке объясняется, как получить помощь по программированию на Stack Overflow, искать существующие отчеты о проблемах, сообщать о новых ошибках и делать запросы на новые функции.