Corriger les erreurs dans votre code converti

Le module complémentaire Macro Converter automatise la majeure partie du processus de conversion, mais vous devrez peut-être ajuster certaines API et d'autres éléments pour finaliser votre code.

Utilisez ce guide pour comprendre les fichiers Apps Script (fichiers GS) ajoutés à votre projet, interpréter les différents types d'erreurs et apprendre à les corriger.

Comprendre les fichiers Apps Script ajoutés à votre projet

D'autres fichiers GS sont ajoutés à votre projet Apps Script pour vous aider à:

  • Définir des constantes et des valeurs VBA qui n'existent pas dans Apps Script.
  • Implémentez les API non converties.
  • Résolvez les variantes.

Les fichiers GS suivants sont ajoutés à votre projet Apps Script:

  • Library.gs
  • Unimplemented_constructs.gs
  • Variant_resolutions.gs

Library.gs

En règle générale, vous n'avez pas besoin de modifier le fichier library.gs.

Le fichier library.gs définit les fonctions et les constantes utilisées dans votre code VBA qui n'existent pas dans Apps Script. Cela permet au nouveau code Apps Script de mieux ressembler votre code VBA. De plus, vous n'avez pas besoin de répéter les définitions chaque fois que des fonctions ou des constantes du fichier library.gs sont utilisées.

Unimplemented_constructs.gs

Le fichier unimplemented_constructs.gs adresse des constructions ou des API qui n'ont pas pu être converties par Macro Converter. Vous devrez probablement modifier ce fichier pour que votre code fonctionne comme prévu.

Exemple : Window.Activate()

Voici un exemple d'API non compatible appelée Window.Activate(). Macro Converter crée une fonction Apps Script avec un nom similaire et la définit dans le fichier unimplemented_constructs.gs. La fonction VBA n'étant pas compatible, la nouvelle fonction Apps Script génère une exception.

La nouvelle fonction est ajoutée au code Apps Script converti, partout où l'API d'origine a été utilisée dans le code VBA.

Si vous trouvez une solution de contournement pour recréer le comportement de l'API d'origine, il vous suffit de mettre à jour la définition de la fonction dans le fichier unimplemented_constructs.gs. Une fois la fonction définie, elle s'applique partout où elle apparaît dans votre projet Apps Script.

Voici l'exemple dans le code:

Code VBA d'origine

Window.activate()

Code Apps Script converti, ajouté directement

_api_window_activate();

Définition d'une fonction ajoutée au fichier unimplemented_constructs.gs

/**
 * Could not convert window.activate API. Please add relevant code in the
 * following function to implement it.
 * This API has been used at the following locations in the VBA script.
 *     module1 : line 3
 *
 * We couldn't find an equivalent API in Apps Script for this VBA API. Please
 * reconsider if this function call is critical, otherwise consider implementing
 * it in a different way.
 */
function _api_window_activate(CallingObject) {
  ThrowException("API window.activate not supported yet.");
}

Variant_resolutions.gs

Le fichier variant_resolutions.gs est ajouté à votre projet Apps Script si le type d'un objet ne peut pas être déterminé. Cela peut se produire pour plusieurs raisons, par exemple si l'API comporte plusieurs types renvoyés ou si l'objet est lui-même déclaré comme variante.

Le convertisseur de macro ajoute une nouvelle fonction à ce fichier appelée __handle_resolve_<api>(), qui remplace l'API en question et aide à déterminer le type d'objet.

Dans certains cas, vous devrez peut-être mettre à jour la fonction __handle_resolve_<api>() pour déclarer manuellement le type d'objet. Consultez la section Type d'objet non compatible.

Exemple : name()

De nombreux types d'objets dans VBA définissent une API name(). En général, l'équivalent Apps Script est getName(), mais pas pour tous les types d'objets. Plusieurs autres cas peuvent se produire:

  • L'API équivalente de l'objet porte un nom différent de getName().
  • L'objet ne possède pas d'API Apps Script permettant d'obtenir son nom.
  • Il n'existe pas d'objet Apps Script équivalent.

Lorsque le type d'objet n'est pas déterminé, Macro Converter crée une fonction appelée __handle_resolve_name dans le fichier variant_resolutions.gs.

Voici l'exemple dans le code:

Code VBA d'origine

a = Selection.name

Dans ce cas, l'API name() est appelée sur la sélection actuelle. La sélection peut être un objet Sheet ou Shape. S'il s'agit d'un objet Sheet, la traduction est getName(), mais s'il s'agit d'un objet Shape, il n'existe pas d'équivalent dans Apps Script.

Code Apps Script converti, ajouté directement

a = __handle_resolve_name({}, getActiveSelection(), {});

La fonction __handle_resolve_name() ci-dessous est ajoutée au fichier variant_resolution.gs pour répondre à différents types d'objets. La fonction vérifie le type d'objet, puis utilise getName() s'il est compatible ou génère une erreur si getName() n'est pas accepté.

Définition d'une fonction ajoutée au fichier variant_resolution.gs

function __handle_resolve_name(ExecutionContext, CallingObject, params_map) {
  var found_api_variant = false;
  var return_value;
  if (String(CallingObject) == "Sheet") {
    if (!ExecutionContext.isLhs) {
      return_value = CallingObject.getName();
      found_api_variant = true;
    }
  }
  if (CallingObject instanceof ChartInSheet) {
    if (!ExecutionContext.isLhs) {
      return_value = CallingObject.getName();
      found_api_variant = true;
    }
  }
  if (!found_api_variant) {
    ThrowException("API .name not supported yet.");
  }
  return return_value;
}

Identifier les erreurs

Lorsque vous rencontrez une erreur dans le code Apps Script converti, le message spécifie le type d'erreur et son emplacement. Le format du message d'erreur dépend de l'environnement d'exécution Apps Script que vous utilisez.

Si vous êtes dans l'environnement d'exécution V8 par défaut, une erreur semblable à celle-ci s'affiche:

_api_windows_active (unimplemented_constructs:2:3)

Cela signifie que l'erreur se trouve dans le fichier unimplemented_constructs.gs, à la ligne 2, caractère 3.

Si vous utilisez l'environnement d'exécution obsolète Rhino, une erreur semblable à celle-ci s'affiche:

unimplemented_constructs:2 (_api_windows_active)

Cela signifie que l'erreur se trouve dans le fichier unimplemented_constructs.gs à la ligne 2.

Types d'erreurs

Vous pouvez corriger la plupart des erreurs que vous rencontrez dans les fichiers unimplemented_constructs.gs et variant_resolution.gs décrits ci-dessus.

Voici les types d'erreurs que vous pourriez rencontrer:

API non implémentée

Une API non implémentée est une API que Macro Converter ne peut pas convertir de VBA en Apps Script, et il n'existe aucune solution de contournement connue pour l'API.

Les API non implémentées sont généralement ajoutées au fichier unimplemented_constructs.gs en tant que fonctions vides, parfois avec des signatures vides. Si le type d'objet n'a pas pu être déterminé, l'API non implémentée peut être ajoutée au fichier variant_resolution.gs à la place.

Dans le rapport de compatibilité que vous avez généré avant la conversion, cette API est associée au libellé Enquête requise.

Si vous ne corrigez pas ce type d'API dans votre code VBA avant de convertir votre fichier, voici comment il apparaît dans le projet Apps Script:

/**
* Could not convert . Please add relevant code in the following
* function to implement it.
* This API has been used at the following locations in the VBA script.
*      : 
* We couldn't find an equivalent API in Apps Script for this VBA API. Please
* reconsider if this function call is critical, otherwise consider implementing
* it in a different way.
* @param param1 {}
* @param param2 {}
* ...
* @return {}
*/
function _api_(param1, param2, ....) {
  ThrowException("API  not supported yet.");
}

Corriger les erreurs d'API non implémentées

Définissez l'API non implémentée à l'aide des bibliothèques JS ou des API Apps Script existantes. Pour ce faire, procédez comme suit :

  1. Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez Trouver les erreurs.
  2. Lisez le commentaire qui a été ajouté au-dessus de la fonction. Dans certains cas, le commentaire suggère comment implémenter l'API dans Apps Script.
  3. Si vous ne trouvez pas de moyen d'implémenter l'API dans Apps Script, envisagez de la supprimer de votre code.
  4. Si vous ne parvenez pas à trouver une solution de contournement ou si vous ne parvenez pas à supprimer cette API de votre code et que votre macro génère cette erreur, vous ne pourrez pas la convertir.

Exemples d'erreurs d'API non implémentées

Voici des exemples de scénarios d'API non implémentés et comment les résoudre:

  • Il n'existe pas d'équivalent Apps Script : affiche une solution de contournement indirecte pour Chart.Protect, une API qui n'existe pas dans Apps Script.
  • Un type d'objet inconnu: explique comment gérer un type d'objet qui est une variable et comment implémenter un type d'objet non compatible pouvant être recréé dans Apps Script.
Exemple 1: Pas d'équivalent Apps Script ou d'API inconnue

Dans cet exemple, Chart.Protect n'a pas été converti automatiquement, car il n'existe aucun moyen de protéger un graphique dans Google Sheets.

/**
* Could not convert chart.protect API. Please add relevant code in the following
* function to implement it.
*
* This API has been used at the following locations in the VBA script.
*     sheet1 : line 3
* You can use the following Apps Script APIs to convert it.
*
* Comments : Auto conversion of Chart.Protect is not supported yet. If the API is
* critical for the workflow the user can implement the unimplemented handler
* method in the generated code, else comment out the throw statement.
*
* @param {Object} CallingObject represents the parent object using which the API
* has been called.
* @param {string} Password
* @param {boolean} DrawingObjects
* @param {boolean} Contents
* @param {boolean} Scenarios
* @param {boolean} UserInterfaceOnly
*
*/
function _api_chart_protect(
   CallingObject, Password, DrawingObjects, Contents, Scenarios,
   UserInterfaceOnly) {
 ThrowException('API chart.protect not supported yet.');
}
Même si vous ne pouvez pas protéger un graphique, vous pouvez protéger sa plage de données afin que les données ne puissent pas être modifiées.

Vous trouverez ci-dessous un exemple d'implémentation de la protection de la plage:
/**
* Could not convert chart.protect API. Please add relevant code in the following
* function to implement it.
* This API has been used at the following locations in the VBA script.
*     sheet1 : line 3
*
* You can use the following Apps Script APIs to convert it.
* Comments : Auto conversion of Chart.Protect is not supported yet. If the API
* is critical for the workflow the user can implement the unimplemented handler
* method in the generated code, else comment out the throw statement.
*
* @param {Object} CallingObject represents the parent object using which the API
* has been called.
* @param {string} Password
* @param {boolean} DrawingObjects
* @param {boolean} Contents
* @param {boolean} Scenarios
* @param {boolean} UserInterfaceOnly
*/
function _api_chart_protect(
  CallingObject, Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly) {
var ranges = CallingObject.getChart().getRanges();
for (var i = 0; i < ranges.length; i++) {
  // Note that this does not lock the range for the document owner.
  ranges[i].protect();
}
}
Exemple 2: Type d'objet non compatible

Lorsque le type d'objet est inconnu, l'erreur d'API non implémentée est ajoutée au fichier variant_resolution.gs. L'exemple suivant développe l'exemple d'API VBA name() ci-dessus. Voir variant_resolution.gs.

Dans cet exemple, vous découvrirez:

  1. Comment l'API name() est convertie en une nouvelle fonction dans le fichier variant_resolution.gs.
  2. Comment la nouvelle fonction est appelée dans le code converti.
  3. Comment créer une solution de contournement pour CommandBar, un type d'objet non compatible, dans Apps Script.

1. Étant donné que le code converti ne peut pas déterminer le type d'objet exact sur lequel name() est appelé, Macro Converter crée une fonction appelée __handle_resolve_name, comme indiqué ci-dessous.

function __handle_resolve_name(ExecutionContext, CallingObject, params_map) {
 var found_api_variant = false;
 var return_value;
  if (String(CallingObject) == "Sheet") {
    if (!ExecutionContext.isLhs) {
      return_value = CallingObject.getName();
      found_api_variant = true;
    }
  }
  if (CallingObject instanceof ChartInSheet) {
    if (!ExecutionContext.isLhs) {
      return_value = CallingObject.getName();
      found_api_variant = true;
    }
  }
  if (!found_api_variant) {
    ThrowException('API .name not supported yet.');
  }
  return return_value;
}

2. Supposons que le code VBA définit une fonction PrintName() qui appelle l'API name(). Le code VBA est présenté ci-dessous:

‘Defining a function that prints the name of the object in parameter
Sub PrintName(obj as Variant)
  Debug.Print obj.Name
End Sub
Comme la méthode `name()` est appelée sur un objet qui est une variable, le code converti ne connaît pas le type d'objet au moment de la conversion. Le code Apps Script converti appelle la fonction `__handle_resolve_name` :
function PrintName(obj) {
  Logger.log(_handle_resolve_name(obj));
}

3. Supposons que votre code VBA appelle la fonction PrintName() sur le type d'objet CommandBar. Le code VBA est présenté ci-dessous:

PrintName Application.CommandBars.item("Standard")
CommandBar n'est pas compatible avec Apps Script. Par conséquent, les deux méthodes utilisées dans le code VBA ci-dessus ne sont pas non plus compatibles.
  • Application.CommandBars(): dans VBA, renvoie la liste de tous les objets CommandBar.
  • CommandBars.item(): dans VBA, renvoie un objet CommandBar spécifique.
Ce type d'objet n'étant pas compatible avec Apps Script, le code converti crée les fonctions suivantes dans le fichier "unimplementation_constructs.gs" que vous devez définir.
  • _api_application_commandbars()
  • _api_commandbars_item()
Les fonctions sont appelées dans le code converti comme indiqué ci-dessous:
PrintName(_api_commandbars_item(_api_application_commandbars(), "Standard")))

Here’s how the new functions are added to the unimplemented_construct.gs file:

function _api_application_commandbars(CallingObject) {
  ThrowException('API application.commandbars not supported yet.');
}
function _api_commandbars_item(CallingObject, index) {
  ThrowException('API commandbars.item not supported yet.');
}

Pour que les nouvelles fonctions fonctionnent, procédez comme suit:

3.1 Définissez un nouveau type d'objet qui crée les fonctionnalités de CommandBars, ainsi qu'une nouvelle collection de CommandBars semblable à ce qui existe dans VBA.

3.2 Ajoutez une méthode getName() pour le nouveau type d'objet.

Les étapes 3.1 et 3.2 sont présentées dans le code ci-dessous. Les objets de menu sont créés en tant que nouveau type d'objet qui imite le comportement de CommandBars.

// Our Implementation of CommandBar using Menu objects.

function CommandBar(name) {
  this.name = name;
  // Create a menu object to represent the commandbar.
  this.menu = SpreadsheetApp.getUi().createMenu(name);
  // Create methods for retrieving or updating the name of the object
  this.getName = function() {
    return this.name;
  };
  this.updateName = function(name) {
    this.name = name;
  };
  // ========================================================================
  // Implement other methods of CommandBar objects that are used in the script.
  // =====================================================================
  return this;
}
// Our implementation of the collection of CommandBars that exists in VBA
function CommandBars() {
  this.commandBars = [];
  this.getCommandBar = function(name) {
    for (var i = 0; i < this.commandBars.length; i++) {
      if (!this.commandBars[i].getName() == name) {
        return this.commandBars[i];
      }
    }
    // No commandBar with the name exists, create a new one and return.
    var commandBar = new CommandBar(name);
    this.commandBars.push(commandBar);
    return commandBar;
  };
  return this;
}
// Create a global object that represents CommandBars collection.
var GlobalCommandBars = new CommandBars();

3.3 Modifiez la fonction __handle_resolve_name dans le fichier variant_resolution.gs pour gérer le nouveau type d'objet. Ajoutez une section à la fonction, comme indiqué ci-dessous:

function __handle_resolve_name(ExecutionContext, CallingObject, params_map) {
 var found_api_variant = false;
 var return_value;
 if (String(CallingObject) == "Sheet") {
   if (!ExecutionContext.isLhs) {
     return_value = CallingObject.getName();
     found_api_variant = true;
   }
 }
 if (CallingObject instanceof ChartInSheet) {
   if (!ExecutionContext.isLhs) {
     return_value = CallingObject.getName();
     found_api_variant = true;
   }
 }
 // New section added below
 // ========================================================================
 if (CallingObject instanceof CommandBar) {
   objectExtend(params_map, {VALUETOSET: params_map.param0});
   if (ExecutionContext.isLhs) {
     // Call the setter method.
     CallingObject.updateName(params_map.VALUETOSET);
     found_api_variant = true;
   } else {
     // Getter is called, return the commandbar name,
     return_value = CallingObject.getName();
     found_api_variant = true;
   }
 }
 // ========================================================================
 // New section added above
 if (!found_api_variant) {
   ThrowException('API .name not supported yet.');
 }
 return return_value;
}

3.4 Définissez les deux fonctions créées dans le fichier unimplemented_constructs.gs (_api_application_commandbars(), _api_commandbars_item()). Cette étape permet de s'assurer que les appels d'origine de la fonction fonctionnent.

//This is straightforward based on the implementation of a CommandBar and the
// CommandBars collection above:
function _api_application_commandbars(CallingObject) {
 return GlobalCommandBars;
}
function _api_commandbars_item(CallingObject, index) {
 return CallingObject.getCommandBar(index);
}

Constructions de langage non implémentées

Une construct est un élément du langage de code qui contrôle le flux d'exécution ou l'affichage des données. (boucles, libellés, événements et getos, par exemple). Voici la liste de toutes les constructions VBA.

Les constructions que Macro Converter ne peut pas convertir sont considérées comme des constructions de langage non implémentées.

Lorsque le convertisseur de macro détermine qu'une construction de langage non implémentée existe, il insère un commentaire TODO.

Les constructions VBA suivantes ne sont pas compatibles:

Corriger les erreurs de construction de langage non implémentées

  1. Mettez à jour votre code afin que votre logique ne s'appuie pas sur la construction du langage non compatible.
  2. Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez la section Rechercher les erreurs.
  3. En fonction de la logique du code, mettez-le à jour de manière à ne pas nécessiter la construction de langage non compatible.
  4. Si vous ne trouvez pas de moyen de réécrire votre code sans la construction du langage non compatible, vous ne pouvez pas convertir cette macro.

Exemples d'erreurs de construction de langage non implémentées

L'une des constructions de langage non implémentées les plus courantes est l'instruction GoTo. Vous pouvez remplacer certaines instructions VBA GoTo par des boucles. Vous trouverez ci-dessous deux exemples d'utilisation de boucles au lieu d'instructions GoTo.

Exemple 1: Remplacer GoTo par While Loop

Code VBA d'origine
Sub Test()
 a = 0
 start: Debug.Print a
 While a < 100
   a = a + 1
   If a Mod 3 == 0
     Goto start
   End If
 Wend
End Sub
Code Apps Script équivalent
function test() {
 var a = 0;
 start: do {
   console.log(a);
   while (a < 100) {
     a = a + 1;
     if (a % 3 == 0) {
       continue start;
     }
   }
   break start;
 } while (true);
}

Exemple 2: Remplacer GoTo par une boucle For

Code VBA d'origine
Sub Test()
 a = 0
 For i = 1 to 100
   For j = 1 to 10
     a =a a + 1
     If i + j > 50
       GoTo endLoop
     End If
   Next j
 Next i
 endLoop: MsgBox a
End Sub
Code Apps Script équivalent
function test() {
 var a = 0;
 endLoop: for (var i = 1; i <= 100; i++) {
    for  (var j = 0; j <=10; j++) {
      If (i + j > 50) {
        break endLoop;
      }
    }
 }
 Browser.msgBox(a);
}

   break start;
 } while (true);
}

API partiellement compatible

Pour les API partiellement compatibles, certains paramètres d'entrée sont compatibles avec Apps Script et d'autres non.

Par exemple, l'API VBA legend_position permet de définir la légende dans un graphique Excel. Il accepte plusieurs types de valeurs d'entrée, y compris les suivants:

  • xlLegendPositionBottom: place la légende au bas du graphique.
  • xlLegendPositionCorner: place la légende dans l'angle du graphique.
  • xlLegendPositionCustom: place la légende à des positions personnalisées sur le graphique.

Apps Script possède un code équivalent qui n'accepte qu'une partie de ces valeurs. Les valeurs suivantes ne sont pas acceptées:

  • xlLegendPositionCorner
  • xlLegendPositionCustom

Pour signaler les valeurs non compatibles des API partiellement compatibles dans votre code converti, une condition de validation est ajoutée au fichier library.gs qui vérifie ces valeurs. Exemple :

if (position == xlLegendPositionCorner ||
     position == xlLegendPositionCustom) {
   position = _handle_legend_position_error(position);
}

Si la condition de validation trouve l'une des valeurs non acceptées, une fonction de gestionnaire d'erreurs, _handle_<API_name>_error, est créée dans le fichier unimplemented_constructs.gs.

La fonction génère une erreur utilisateur et ne remplacera pas la valeur par une valeur compatible. Exemple :

/**
* Throw error message for unsupported legend position.
* The VBA API Legend.Position which can take values xlLegendPositionTop,
* xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight,
* xlLegendPositionCorner, xlLegendPositionCustom. It is partially supported in
* Apps Scripts that supports only a subset of the values (does not support
* xlLegendPositionCorner and xlLegendPositionCustom).
* @param {string} position
*/
function _handle_legend_position_error(position) {
// Please comment the throw statement and return a supported position value
// instead.
// Values that are supported here are xlLegendPositionTop,
// xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight.
throw new Error(
   'Google Sheets does not support legend position: ' + position);
}

Corriger les erreurs d'API partiellement compatibles

Définissez la fonction _handle_<API_name>_error pour remplacer les valeurs non acceptées par une solution de contournement acceptable.

  1. Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez Trouver les erreurs.
  2. Lisez le commentaire au-dessus de la fonction pour connaître les valeurs acceptées et non compatibles.
  3. Pour les valeurs non acceptées, déterminez lesquelles peuvent remplacer de manière appropriée.
  4. Mettez à jour la fonction _handle_<API_name>_error pour renvoyer une valeur acceptée à la place.
  5. Si vous ne trouvez pas de moyen de remplacer la valeur non acceptée, vous ne pouvez pas convertir cette macro.

Exemple d'erreur d'API partiellement compatible

L'exemple suivant développe l'API VBA legend_position mentionnée ci-dessus. Consultez API partiellement compatible.

Vous trouverez ci-dessous un exemple de code VBA d'origine qui utilise une valeur non acceptée : xlLegendPositionCustom.

Charts(1).Legend.Position = xlLegendPositionCustom

Macro Converter ajoute la fonction ci-dessous au fichier unimplemented_constructs.gs:

/**
* Throw error message for unsupported legend position.
* The VBA API Legend.Position which can take values xlLegendPositionTop,
* xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight,
* xlLegendPositionCorner, xlLegendPositionCustom. It is partially supported in
* Apps Scripts that supports only a subset of the values (does not support
* xlLegendPositionCorner and xlLegendPositionCustom).
* @param {string} position
*/
function _handle_legend_position_error(position) {
// Please comment the throw statement and return a supported position value
// instead.
// Values that are supported here are xlLegendPositionTop,
// xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight.
throw new Error(
   'Google Sheets does not support legend position: ' + position);
}

Travail manuel nécessaire

Une opération manuelle est nécessaire signifie que l'API VBA peut être convertie en Apps Script, mais qu'une solution est nécessaire.

Dans le rapport de compatibilité que vous avez généré avant la conversion, ce type d'API est marqué comme Compatible avec des solutions de contournement.

Si vous ne corrigez pas ce type d'API dans votre code VBA avant de convertir votre fichier, voici comment il apparaît dans le projet Apps Script:

/**
* Could not convert  API. Please add relevant code in the following
* function to implement it.
* This API has been used at the following locations in the VBA script.
*      : 
*
* You can use the following Apps Script APIs to convert it.
* Apps Script APIs : 
* Apps Script documentation links : 
*
* @param param1 {}
* @param param2 {}
* ...
* @return {}
*/
function _api_(param1, param2, ....) {
 ThrowException("API  not supported yet.");
}

Corriger les erreurs liées aux tâches manuelles nécessaires

Implémentez une solution de contournement pour que l'API fonctionne comme prévu. 1. Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez Trouver les erreurs. 1. Lisez le commentaire au-dessus de la fonction pour savoir quelles API peuvent être utilisées pour une solution de contournement. 1. Si vous ne trouvez pas de solution de contournement appropriée, envisagez de supprimer l'API de votre code. 1. Si vous ne trouvez pas de solution de contournement ou si vous ne parvenez pas à supprimer cette API de votre code et que votre macro génère une erreur, vous ne pourrez pas la convertir.

Exemples d'erreurs "Travail manuel nécessaire"

Voici des exemples d'API qui génèrent des erreurs de tâche manuelle et comment les corriger:

Exemple 1: Autocorrect.Addreplacement

Dans l'exemple suivant, l'API VBA Autocorrect.Addreplacement peut être convertie, mais elle nécessite une solution de contournement. Macro Converter suggère comment implémenter la fonction dans les commentaires du code.

/**
* Could not convert autocorrect.addreplacement API. Please add relevant code in
* the following function to implement it.
* This API has been used at the following locations in the VBA script.
*     sheet1 : line 3
* You can use the following Apps Script APIs to convert it.
* Apps Script APIs : FindReplaceRequest , onEdit
* Apps Script documentation links :
* https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit
* https://developers.google.com/sheets/api/eap/reference/rest/v4/spreadsheets/request?hl=en#findreplacerequest

* Comments : AutoCorrect.AddReplacement was not converted, but there is an
* equivalent option you can implement manually. Use onEdit and FindReplaceRequest
* APIs instead, see https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit
* and https://developers.google.com/sheets/api/eap/reference/rest/v4/spreadsheets/request?hl=en#findreplacerequest.
* For more information on API manual implementation, see
* https://developers.google.com/apps-script/guides/macro-converter/fix-conversion-errors.

* @param {Object} CallingObject represents the parent object using which the API
* has been called.
* @param {string} What
* @param {string} Replacement
* @return {string}
*/

function _api_autocorrect_addreplacement(CallingObject, What, Replacement) {
  ThrowException('API autocorrect.addreplacement not supported yet.');

}

L'implémentation de l'API Autocorrect.Addreplacement est présentée ci-dessous:

var AUTO_CORRECTIONS = "AUTO_CORRECTIONS";
// Need to get the autocorrections set in previous sessions and use them.
var savedAutoCorrections = PropertiesService.getDocumentProperties().getProperty(AUTO_CORRECTIONS);
var autoCorrections = savedAutoCorrections ? JSON.parse(savedAutoCorrections) : {};
function onEdit(e) {
autoCorrect(e.range);
}
function autoCorrect(range) {
for (key in autoCorrections) {
// Replace each word that needs to be auto-corrected with their replacements.
range.createTextFinder(key)
.matchCase(true)
.matchEntireCell(false)
.matchFormulaText(false)
.useRegularExpression(false)
.replaceAllWith(autoCorrections[key]);
}
}
/**
* Could not convert autocorrect.addreplacement API. Please add relevant code in
* the following function to implement it.
* This API has been used at the following locations in the VBA script.
* sheet1 : line 3
*
* You can use the following Apps Script APIs to convert it.
* Apps Script APIs : createTextFinder , onEdit
* Apps Script documentation links : https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit ,
createTextFinder
* Comments : AutoCorrect.AddReplacement was not converted, but there is an
* equivalent option you can implement manually. Use onEdit and FindReplaceRequest
* APIs instead, see https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit
* and createTextFinder. For more information on API manual implementation, see
* https://developers.google.com/apps-script/guides/macro-converter/fix-conversion-errors.
*
* @param {Object} CallingObject represents the parent object using which the API has been called.
* @param {string} What
* @param {string} Replacement
*
* @return {string}
*/

function _api_autocorrect_addreplacement(CallingObject, What, Replacement) {
autoCorrections[What] = Replacement;
// Store the updated autoCorrections in the properties so that future executions use the correction.
PropertiesService.getDocumentProperties().setProperty(AUTO_CORRECTIONS, JSON.stringify(autoCorrections));
}

Exemple 2: Workbook.open()

L'API VBA workbook.open() ouvre un fichier local en fonction d'un chemin d'accès au fichier.

Supposons que workbook.open() ouvre deux fichiers dans le code VBA:

  • Fichier 1: C:\Data\abc.xlsx
  • Fichier 2: C:\Data\xyz.xlsx

Vous trouverez ci-dessous comment Macro Converter remplace Workbook.open() par Apps Script partout où Workbook.open() est utilisé pour ouvrir le fichier 1:

var spreadSheetId =
   _handle_mso_excel_get_google_spreadsheet_id("C:\Data\abc.xlsx");
var spreadSheet = SpreadsheetApp.openById(spreadSheetId);
L'erreur ci-dessous est ajoutée au fichier unimplemented_constructs.gs dans le projet Apps Script:
/**
* Method to return the spreadsheet id manually.
*
* @param {string} FileName ID of the spreadsheet to be opened.
* @return {string} return the spreadsheet id.
*/
function _handle_mso_excel_get_google_spreadsheet_id(FileName) {
 // Upload the Excel files being opened by the API to Google Drive and convert
 // them to Google Sheets.
 // Determine the spreadsheet ID of the Google Sheets file created.
 // Implement this method to return the corresponding spreadsheet ID when given
 //the original file path as parameter.
 throw new Error('Please return the spreadsheet ID corresponding to filename: ' + FileName);
 return '';
}

Comme indiqué dans les commentaires de l'exemple ci-dessus, vous devez convertir les fichiers cibles en fichiers Google Sheets dans Google Drive.

Les ID de feuille de calcul Google correspondants apparaissent en gras ci-dessous:

  • Fichier 1: C:\Data\abc.xlsx devient https://docs.google.com/spreadsheets/d/abc123Abc123Abc123abc
  • Fichier 2: C:\Data\abc.xlsx devient https://docs.google.com/spreadsheets/d/xyz456Xyz456xYz456xyZ

Ensuite, modifiez le code de la fonction Apps Script pour ouvrir les fichiers par ID, comme indiqué ci-dessous:

/**
* Method to return the spreadsheet id manually.
*
* @param {string} FileName ID of the spreadsheet to be opened.
* @return {string} return the spreadsheet id.
*/
function _handle_mso_excel_get_google_spreadsheet_id(FileName) {
 // Upload the Excel files being opened by the API to Google Drive and convert
 //them to Google Sheets.
 // Determine the spreadsheet ID of the Google Sheets file created.
 // Implement this method to return the corresponding spreadsheet ID when given
 //the original file path as parameter
 if (Filename.indexOf("abc.xlsx") >= 0) {
   return "abc123Abc123Abc123abc";
 } else if (Filename.indexOf("xyz.xlsx") >= 0) {
   return "xyz456Xyz456xYz456xyZ";
 }

Erreur intentionnelle

Des erreurs intentionnelles sont ajoutées à votre code converti pour imiter le comportement d'erreur de votre code VBA d'origine. Vous n'avez pas besoin de modifier ces erreurs.

Exemple d'erreur intentionnelle

Si vous essayez d'accéder à un élément au-delà des limites d'un tableau dans VBA, le code génère une exception. Dans Apps Script, le code affiche "undefined".

Pour éviter des résultats inattendus, Macro Converter ajoute un code Apps Script qui génère une exception si vous essayez d'accéder à des éléments au-delà des limites d'un tableau.

Cet exemple est illustré dans le code ci-dessous:

Code VBA d'origine
Dim arr
arr = Array("apple", "orange")
MsgBox arr(5)
Will throw the following error:
Subscript out of range
Code Apps Script converti (avant l'ajout de l'erreur d'exception)
var arr;
arr = ["apple", "orange"];
Browser.msgBox(arr[5]);
Will return this value and not throw an error:
undefined
Code Apps Script ajouté pour générer l'erreur d'exception
/**
* Extend the regular JS array to support VB style indexing with a get method.
* @returns{*} value at the index
*/
Array.prototype.get = function() {
 var curr_res = this;
 for (var i = 0; i < arguments.length; i++) {
   if (!Array.isArray(curr_res) || curr_res.length < arguments[i]) {
     throw new Error(‘Converted VBA Error (Intentional Error): Subscript out of range’);
   }
   curr_res = curr_res[arguments[i]];
 }
 return curr_res;
};
var arr;
arr  = ["apple", "orange"];
Browser.msgBox(arr.get(5));