Présentation de l'environnement d'exécution V8

Dans Apps Script et JavaScript, un environnement d'exécution ou un environnement d'exécution contient le moteur JavaScript qui analyse et exécute le code du script. L'environnement d'exécution fournit des règles concernant l'accès à la mémoire, la manière dont le programme peut interagir avec le système d'exploitation de l'ordinateur, ainsi que la syntaxe légale du programme. Chaque navigateur Web dispose d'un environnement d'exécution pour JavaScript.

Historiquement, Apps Script a été fourni par l'interpréteur JavaScript Rhino de Mozilla. Bien que Rhino ait fourni une méthode pratique permettant à Apps Script d'exécuter des scripts de développement, il a également lié Apps Script à une version JavaScript spécifique (ES5). Les développeurs Apps Script ne peuvent pas utiliser une syntaxe et des fonctionnalités JavaScript plus modernes dans les scripts avec l'environnement d'exécution Rhino.

Pour résoudre ce problème, Apps Script est désormais compatible avec l'environnement d'exécution V8 qui alimente Chrome et Node.js. Vous pouvez migrer des scripts existants vers la version 8 afin de profiter de la syntaxe et des fonctionnalités modernes de JavaScript.

Cette page décrit les nouvelles fonctionnalités activées par V8 et comment l'utiliser dans vos scripts. La section Migrer des scripts vers V8 décrit les étapes permettant de migrer des scripts existants afin d'utiliser l'environnement d'exécution V8.

Fonctionnalités de l'environnement d'exécution V8

Les scripts utilisant l'environnement d'exécution V8 peuvent exploiter les fonctionnalités suivantes:

Syntaxe ECMAScript moderne

Vous pouvez utiliser la syntaxe moderne ECMAScript dans les scripts basés sur l'environnement d'exécution V8. Cette syntaxe inclut let, const et de nombreuses autres fonctionnalités populaires.

Consultez la page Exemples de syntaxe V8 pour obtenir une liste courte des améliorations populaires que vous pouvez apporter à l'environnement d'exécution V8.

Amélioration de la détection des fonctions

La détection de fonctions dans Apps Script a été améliorée pour les scripts utilisant la version 8. Le nouvel environnement d'exécution reconnaît les formats de définition de fonction suivants:

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

Appeler des méthodes d'objet à partir de déclencheurs et de rappels

Les scripts utilisant V8 peuvent appeler des méthodes d'objet et des méthodes statiques de classe à partir d'endroits où il était déjà possible d'appeler des méthodes de bibliothèque. Voici quelques exemples:

L'exemple V8 suivant montre l'utilisation de méthodes d'objet lors de la construction d'éléments de menu dans 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');
  }
}

Afficher les journaux

Apps Script fournit deux services de journalisation: le service Logger et la classe console. Ces deux services écrivent des journaux dans le même service Stackdriver Logging.

Pour afficher les journaux Logger et console, cliquez sur Journal d'exécution en haut de l'éditeur de scripts.

Afficher les exécutions

Pour afficher l'historique d'exécution de votre script, ouvrez le projet Apps Script, puis cliquez sur Exécutions à gauche.

Exemples de syntaxe V8

Voici une courte liste des fonctionnalités syntaxiques populaires disponibles pour les scripts utilisant l'environnement d'exécution V8.

let et const

Les mots clés let et const vous permettent respectivement de définir des variables locales de champ d'application et des constantes de champ d'application.

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

Fonctions fléchées

Les fonctions fléchées constituent un moyen compact de définir des fonctions dans des expressions.

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

Classes

Les classes permettent d'organiser conceptuellement le code avec héritage. Les classes de V8 sont principalement du sucre syntaxique sur l'héritage basé sur le prototype 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)
      

Déstructuration des attributions

Les expressions de déstructuration d'attribution constituent un moyen rapide de décompresser les valeurs de tableaux et d'objets dans des variables distinctes.

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


      

Littéraux de modèle

Les littéraux de modèle sont des littéraux de chaîne qui autorisent les expressions intégrées. Ils vous permettent d'éviter les instructions de concaténation de chaînes plus complexes.

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


      

Paramètres par défaut

Les paramètres par défaut vous permettent de spécifier des valeurs par défaut pour les paramètres de fonction dans la déclaration de fonction. Cela peut simplifier le code dans le corps de la fonction, car il vous évite d'attribuer explicitement des valeurs par défaut aux paramètres manquants.

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

      

Chaînes multilignes

Vous pouvez définir des chaînes multilignes en utilisant la même syntaxe que les littéraux de modèle. Comme pour les littéraux de modèle, cette syntaxe vous permet d'éviter les concaténations de chaînes et de simplifier les définitions de chaîne.

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

Activer l'environnement d'exécution V8

Si un script utilise l'environnement d'exécution Rhino, vous pouvez passer à V8 en procédant comme suit:

  1. Ouvrez le projet Apps Script.
  2. À gauche, cliquez sur Paramètres du projet .
  3. Cochez la case Activer l'exécution de Chrome V8.

Vous pouvez également spécifier l'environnement d'exécution du script directement en modifiant le fichier manifeste de script:

  1. Ouvrez le projet Apps Script.
  2. À gauche, cliquez sur Paramètres du projet .
  3. Cochez la case Afficher le fichier manifeste "appsscript.json" dans l'éditeur.
  4. À gauche, cliquez sur Montage > appsscript.json.
  5. Dans le fichier manifeste appsscript.json, définissez le champ runtimeVersion sur la valeur V8.
  6. En haut, cliquez sur Enregistrer le projet .

La section Migrer des scripts vers V8 explique d'autres étapes à suivre pour s'assurer que votre script fonctionne correctement avec cette version.

Activer l'environnement d'exécution Rhino

Si votre script utilise la version V8 et que vous devez le remplacer pour utiliser l'environnement d'exécution Rhino d'origine, procédez comme suit:

  1. Ouvrez le projet Apps Script.
  2. À gauche, cliquez sur Paramètres du projet .
  3. Décochez la case Activer l'exécution de Chrome V8.

Vous pouvez également modifier le fichier manifeste de votre script:

  1. Ouvrez le projet Apps Script.
  2. À gauche, cliquez sur Paramètres du projet .
  3. Cochez la case Afficher le fichier manifeste "appsscript.json" dans l'éditeur.
  4. À gauche, cliquez sur Montage > appsscript.json.
  5. Dans le fichier manifeste appsscript.json, définissez le champ runtimeVersion sur la valeur DEPRECATED_ES5.
  6. En haut, cliquez sur Enregistrer le projet .

Comment migrer des scripts existants ?

Le guide Migrer des scripts vers la version 8 décrit les étapes à suivre pour migrer un script existant vers la version 8. Cela implique d'activer l'environnement d'exécution V8 et de rechercher d'éventuelles incompatibilités dans le script.

Migration automatique des scripts vers la version 8

À compter du 18 février 2020, Google commencera à migrer progressivement les scripts existants qui réussissent notre test de compatibilité automatisé vers V8. Les scripts concernés continuent de fonctionner normalement après la migration.

Si vous souhaitez désactiver la migration automatique d'un script, définissez le champ runtimeVersion dans son fichier manifeste sur DEPRECATED_ES5. Vous pouvez choisir de migrer le script manuellement vers la version V8 à tout moment par la suite.

Comment signaler des bugs ?

Le guide d'assistance explique comment obtenir de l'aide concernant la programmation sur Stack Overflow, rechercher des rapports sur des problèmes existants, signaler de nouveaux bugs et demander de nouvelles fonctionnalités.