在 Apps 脚本和 JavaScript 中,运行时或运行时环境包含 解析和执行脚本代码的 JavaScript 引擎。运行时提供 内存访问规则、程序如何与 计算机操作系统,以及哪种程序语法是合法的。每个网站 提供 JavaScript 运行时环境。
Apps 脚本由 Mozilla 的 Rhino JavaScript 提供支持 翻译。虽然 Rhino 提供了一种便捷的 Apps 脚本执行方式, 开发者脚本,也会将 Apps 脚本与特定的 JavaScript 版本相关联 (ES5)。Apps 脚本开发者 无法使用 Rhino 工具在脚本中使用更现代的 JavaScript 语法和功能 运行时。
为了解决这个问题, 为 Chrome 和 Node.js 提供支持的 V8 运行时。您可以 将现有脚本迁移到 V8 ,从而充分利用现代 JavaScript 语法和功能。
此页面介绍了 V8 启用的新功能以及如何启用 V8 以便在脚本中使用 将脚本迁移到 V8 介绍了迁移现有脚本以使用 V8 运行时的步骤。
V8 运行时的功能
使用 V8 运行时的脚本可以利用以下功能 功能:
现代 ECMAScript 语法
您可以使用新型 ECMAScript
语法。此语法包括
let
、const
以及许多其他热门功能。
请参阅 V8 语法示例,获取热门选项列表 语法改进。
改进了功能检测
针对使用 V8 的脚本改进了 Apps 脚本功能检测。新的 运行时可识别以下函数定义格式:
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() {
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 脚本提供两种日志记录服务:
Logger
服务和
console
类。这两种服务
将日志写入相同的
Stackdriver Logging 服务。
如需显示 Logger
和 console
日志,请点击脚本编辑器顶部的
执行日志。
查看执行情况
要查看脚本的执行历史记录,请打开 Apps 脚本项目,然后前往 点击左侧的执行项
。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: 执行以下操作:
- 打开 Apps 脚本项目。
- 点击左侧的项目设置 。
- 选中启用 Chrome V8 运行时复选框。
或者,您可以通过以下命令直接指定脚本运行时 修改脚本清单 文件:
- 打开 Apps 脚本项目。
- 点击左侧的项目设置 。
- 选择显示“appsscript.json”“清单文件”复选框。
- 点击左侧的 Editor
appsscript.json
。
>
- 在
appsscript.json
清单文件中,设置runtimeVersion
字段的值V8
。 - 点击顶部的保存项目 。
有关将脚本迁移到 V8 的说明 确保脚本使用 V8 能够正常运行的其他步骤。
启用 Rhino 运行时
如果您的脚本使用的是 V8,并且您需要将其切换为原始版本 Rhino 运行时,请执行以下操作:
- 打开 Apps 脚本项目。
- 点击左侧的项目设置 。
- 取消选中启用 Chrome V8 运行时复选框。
或者,修改您的脚本清单:
- 打开 Apps 脚本项目。
- 点击左侧的项目设置 。
- 选择显示“appsscript.json”“清单文件”复选框。
- 点击左侧的 Editor
appsscript.json
。
>
- 在
appsscript.json
清单文件中,设置runtimeVersion
字段的值DEPRECATED_ES5
。 - 点击顶部的保存项目 。
如何迁移现有脚本?
将脚本迁移到 V8 指南介绍了将现有脚本迁移到 请使用 V8。这涉及启用 V8 运行时并检查脚本 任何已知的不兼容性问题
将脚本自动迁移到 V8
从 2020 年 2 月 18 日开始,Google 将开始逐步迁移现有的 通过我们的自动兼容性测试的脚本。受影响的脚本 在迁移后继续正常运行。
如果您希望为某个脚本停用自动迁移功能,请将
runtimeVersion
字段设置为 DEPRECATED_ES5
。您可以选择手动
将脚本迁移到 V8
。
如何报告错误?
支持指南介绍了如何开始编程 在 Stack Overflow 上寻求帮助,搜索现有问题报告,提交新错误,以及 提出新功能请求。