Visão geral do ambiente de execução do V8

No Apps Script e no JavaScript, um ambiente de execução ou um ambiente de execução contém o mecanismo JavaScript que analisa e executa o código do script. O ambiente de execução fornece regras sobre como a memória é acessada, como o programa pode interagir com o sistema operacional do computador e qual sintaxe do programa é legal. Cada navegador da Web tem um ambiente de execução para JavaScript.

Historicamente, o Apps Script usa a tecnologia do intérprete Rhino JavaScript do Mozilla. Embora o Rhino ofereça uma maneira conveniente para o Apps Script executar scripts de desenvolvedor, ele também vinculou o Apps Script a uma versão específica do JavaScript (ES5). Os desenvolvedores do Apps Script não podem usar sintaxe e recursos mais modernos do JavaScript em scripts que usam o ambiente de execução do Rhino.

Para resolver esse problema, o Apps Script agora é compatível com o ambiente de execução V8, que faz parte do Chrome e do Node.js. Você pode migrar os scripts existentes para o V8 se quiser aproveitar a sintaxe e os recursos modernos do JavaScript.

Esta página descreve os novos recursos ativados pelo V8 e como você pode ativar o V8 para uso nos seus scripts. Em Como migrar scripts para o V8, descrevemos as etapas de migração de scripts existentes para usar o ambiente de execução do V8.

Recursos do ambiente de execução do V8

Os scripts que usam o ambiente de execução do V8 podem aproveitar os seguintes recursos:

Sintaxe de ECMAScript moderno

É possível usar a sintaxe moderna do ECMAScript em scripts com tecnologia do ambiente de execução do V8. Essa sintaxe inclui let, const e muitos outros recursos conhecidos.

Consulte Exemplos de sintaxe do V8 para ver uma pequena lista de melhorias de sintaxe conhecidas que podem ser feitas usando o ambiente de execução do V8.

Detecção de função aprimorada

A detecção da função do Apps Script foi aprimorada para scripts que usam o V8. O novo ambiente de execução reconhece estes formatos de definição de função:

      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 () => {}

Chamar métodos de objeto de gatilhos e callbacks

Os scripts que usam o V8 podem chamar métodos de objeto e métodos estáticos de classe de lugares em que você já poderia chamar métodos da biblioteca. Esses locais incluem:

O exemplo do V8 a seguir mostra o uso de métodos de objeto ao criar itens de menu nas Planilhas 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');
  }
}

Ver registros

O Apps Script oferece dois serviços de geração de registros: o Logger e a classe console. Esses dois serviços gravam registros no mesmo serviço do Stackdriver Logging.

Para mostrar os registros Logger e console, na parte superior do editor de script, clique em Registro de execução.

Ver execuções

Para ver o histórico de execução do seu script, abra o projeto do Apps Script e, à esquerda, clique em Execuções .

Exemplos de sintaxe do V8

Veja a seguir uma pequena lista de recursos sintáticos conhecidos disponíveis para scripts que usam o tempo de execução do V8.

let e const

As palavras-chave let e const permitem que você defina variáveis locais de escopo de bloco e constantes de escopo de bloco, respectivamente.

// 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
      

Funções de seta

As funções de seta oferecem uma maneira compacta de definir funções dentro das expressões.

// 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));
      

Aulas

As classes fornecem um meio de organizar conceitualmente o código com herança. As classes no V8 são basicamente açúcar sintático sobre a herança baseada em protótipo de 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)
      

Desestruturar atribuições

Expressões de atribuição de desestruturação são uma maneira rápida de descompactar valores de matrizes e objetos em variáveis distintas.

// 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


      

Literais de modelos

Os literais de modelo são literais de string que permitem expressões incorporadas. Elas permitem evitar instruções mais complexas de concatenação de strings.

// 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}`;


      

Parâmetros padrão

Os parâmetros padrão permitem especificar valores padrão para os parâmetros da função na declaração da função. Isso pode simplificar o código no corpo da função, já que elimina a necessidade de atribuir explicitamente valores padrão aos parâmetros ausentes.

// 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!"

      

Strings de várias linhas

É possível definir strings de várias linhas usando a mesma sintaxe dos literais de modelo. Assim como nos literais de modelo, essa sintaxe permite evitar concatenações de strings e simplificar as definições de string.

// 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`;
      

Como ativar o ambiente de execução do V8

Se um script estiver usando o ambiente de execução do Rhino, será possível alterá-lo para o V8 fazendo o seguinte:

  1. Abra o projeto do Apps Script.
  2. À esquerda, clique em Project Settings .
  3. Marque a caixa de seleção Ativar o tempo de execução do Chrome V8.

Também é possível especificar o ambiente de execução do script diretamente editando o arquivo de manifesto do script:

  1. Abra o projeto do Apps Script.
  2. À esquerda, clique em Project Settings .
  3. Selecione a caixa de seleção Mostrar arquivo de manifesto "appsscript.json" no editor.
  4. À esquerda, clique em Editor > appsscript.json.
  5. No arquivo de manifesto appsscript.json, defina o campo runtimeVersion como o valor V8.
  6. Na parte de cima, clique em Salvar projeto .

Como migrar scripts para o V8 explica outras etapas que você precisa seguir para garantir que seu script funcione bem usando o V8.

Como ativar o ambiente de execução do Rhino

Se o script estiver usando o V8 e você precisar mudá-lo para usar o ambiente de execução original do Rhino, faça o seguinte:

  1. Abra o projeto do Apps Script.
  2. À esquerda, clique em Project Settings .
  3. Desmarque a caixa de seleção Ativar o tempo de execução do Chrome V8.

Como alternativa, edite o manifesto do script:

  1. Abra o projeto do Apps Script.
  2. À esquerda, clique em Project Settings .
  3. Selecione a caixa de seleção Mostrar arquivo de manifesto "appsscript.json" no editor.
  4. À esquerda, clique em Editor > appsscript.json.
  5. No arquivo de manifesto appsscript.json, defina o campo runtimeVersion como o valor DEPRECATED_ES5.
  6. Na parte de cima, clique em Salvar projeto .

Como faço para migrar scripts atuais?

O guia Como migrar scripts para o V8 descreve as etapas necessárias para migrar um script existente e usar o V8. Isso envolve ativar o tempo de execução do V8 e verificar se há incompatibilidades conhecidas no script.

Migração automática de scripts para o V8

A partir de 18 de fevereiro de 2020, o Google começará a migrar gradualmente os scripts atuais que passam no nosso teste de compatibilidade automatizado para o V8. Os scripts afetados continuam funcionando normalmente após a migração.

Se você quiser desativar a migração automática de um script, defina o campo runtimeVersion no manifesto como DEPRECATED_ES5. É possível migrar o script para o V8 manualmente a qualquer momento depois disso.

Como informo sobre bugs?

O guia de suporte explica como receber ajuda de programação no Stack Overflow, pesquisar relatórios de problemas existentes, registrar novos bugs e fazer novas solicitações de recursos.