В 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
Среда выполнения Apps Script V8 не является стандартной средой Node.js или браузера. Это может привести к проблемам совместимости при вызове сторонних библиотек или адаптации примеров кода из других сред JavaScript.
Недоступные API
Следующие стандартные API JavaScript НЕ доступны в среде выполнения Apps Script V8:
- Таймеры :
setTimeout,setInterval,clearTimeout,clearInterval - Потоки :
ReadableStream,WritableStream,TextEncoder,TextDecoder - Веб-API :
fetch,FormData,File,Blob,URL,URLSearchParams,DOMException,atob,btoa - Crypto :
crypto,SubtleCrypto - Глобальные объекты :
window,navigator,performance,process(Node.js)
В качестве альтернативы используйте следующие API-интерфейсы Apps Script:
- Таймеры : используйте
Utilities.sleepдля синхронных пауз. Асинхронные таймеры не поддерживаются. - Извлечение : используйте
UrlFetchApp.fetch(url, params)для выполнения HTTP(S)-запросов. - atob : Используйте
Utilities.base64Decodeдля декодирования строк в кодировке Base64. - btoa : Используйте
Utilities.base64Encodeдля кодирования строк в Base64. - Крипто : используйте
Utilitiesдля криптографических функций, таких какcomputeDigest,computeHmacSha256SignatureиcomputeRsaSha256Signature.
Для API, для которых нет альтернативы Apps Script, например, TextEncoder , иногда можно использовать полифилл. Полифилл — это библиотека, которая воспроизводит функциональность API, отсутствующую по умолчанию в среде выполнения. Перед использованием полифилла убедитесь, что он совместим со средой выполнения Apps Script V8.
Асинхронные ограничения
Среда выполнения V8 поддерживает синтаксис async и await , а также объект Promise . Однако среда выполнения Apps Script по сути является синхронной.
- Микрозадачи (поддерживается) : среда выполнения обрабатывает очередь микрозадач (где происходят обратные вызовы
Promise.thenи разрешенияawait) после очистки текущего стека вызовов. - Макротаски (не поддерживаются) : в Apps Script нет стандартного цикла событий для макроротасков. Функции, такие как
setTimeoutиsetIntervalнедоступны. - Исключение WebAssembly : API WebAssembly — единственная встроенная функция, которая работает неблокирующим образом во время выполнения, допуская определенные шаблоны асинхронной компиляции (WebAssembly.instantiate).
Все операции ввода-вывода, такие как UrlFetchApp.fetch , являются блокирующими. Для реализации параллельных сетевых запросов используйте UrlFetchApp.fetchAll .
Ограничения класса
Среда выполнения V8 имеет определенные ограничения относительно современных функций класса ES6+:
- Приватные поля : Приватные поля класса (например,
#field) не поддерживаются и вызывают ошибки анализа. Для полной инкапсуляции рекомендуется использовать замыкания илиWeakMap. - Статические поля : прямое объявление статических полей внутри тела класса (например,
static count = 0;) не поддерживается. Статические свойства следует назначать классу после его определения (например,MyClass.count = 0;).
Ограничения модуля
- Модули ES6 : Среда выполнения V8 не поддерживает модули ES6 (
import/export). Для использования библиотек необходимо либо использовать механизм библиотеки Apps Script , либо объединить код и его зависимости в один файл скрипта. ( Трекер ошибок ) - Порядок выполнения файлов : все файлы скриптов в вашем проекте выполняются в глобальной области видимости. Рекомендуется избегать кода верхнего уровня с побочными эффектами и обеспечивать определение функций и классов до их использования в разных файлах. Если между файлами существуют зависимости, явно упорядочивайте их в редакторе.
Включение среды выполнения 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, искать существующие отчеты о проблемах, сообщать о новых ошибках и делать запросы на новые функции.