El complemento Macro Converter automatiza la mayor parte del proceso de conversión, pero es posible que debas realizar ajustes en algunas APIs y otros elementos para finalizar tu código.
Usa esta guía para comprender los archivos de Apps Script (archivos GS) que se agregaron a tu proyecto, interpretar los diferentes tipos de errores y aprender a corregirlos.
Información sobre los archivos de Apps Script que se agregaron a tu proyecto
Se agregan archivos GS adicionales a tu proyecto de Apps Script para ayudar a hacer lo siguiente:
- Define constantes y valores de VBA que no existen en Apps Script.
- Implementar APIs sin convertir
- Resuelve las variantes.
Se agregan los siguientes archivos GS a tu proyecto de Apps Script:
Library.gs
Unimplemented_constructs.gs
Variant_resolutions.gs
Library.gs
En general, no es necesario que modifiques nada en el archivo library.gs
.
El archivo library.gs
define las funciones y constantes que se usaron en tu código de VBA y que no existen en Apps Script. Esto ayuda a que el nuevo código de Apps Script se asemeje más al código de VBA. Además, no es necesario repetir las definiciones cada vez que se usan las funciones o constantes del archivo library.gs
.
Unimplemented_constructs.gs
El archivo unimplemented_constructs.gs
aborda construcciones o APIs que Macro Converter no pudo convertir. Es probable que debas modificar este archivo para que tu código funcione según lo previsto.
Ejemplo: Window.Activate()
El siguiente es un ejemplo de una API no compatible llamada Window.Activate()
.
El convertidor de macros crea una nueva función de Apps Script con un nombre similar y la define en el archivo unimplemented_constructs.gs
. Como la función VBA
no es compatible, la nueva función de Apps Script arroja una excepción.
La función nueva se agrega al código convertido de Apps Script en todas las partes en las que se usó la API original en el código de VBA.
Si encuentras una solución para volver a crear el comportamiento de la API original, solo debes actualizar la definición de la función en el archivo unimplemented_constructs.gs
. Una vez que se define allí, se aplica en todas partes donde aparezca la función en tu proyecto de Apps Script.
Este es el ejemplo en código:
Código VBA original
Window.activate()
Código convertido de Apps Script, agregado intercalado
_api_window_activate();
Se agregó la definición de la función al archivo 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
El archivo variant_resolutions.gs
se agrega a tu proyecto de Apps Script si no se puede determinar el tipo de un objeto. Esto puede suceder por varios motivos, por ejemplo, que una API tenga varios tipos de datos que se muestran o que el objeto se declare como una variante.
Macro Converter agrega una función nueva a este archivo llamada __handle_resolve_<api>()
, que reemplaza la API en cuestión y ayuda a determinar el tipo de objeto.
En algunos casos, es posible que debas actualizar la función __handle_resolve_<api>()
para
declarar el tipo de objeto de forma manual. Consulta Tipo de objeto no compatible.
Ejemplo: name()
Muchos tipos de objetos en VBA definen una API de name()
. Por lo general, el equivalente de Apps Script es getName()
, pero no para todos los tipos de objetos. Pueden ocurrir varios casos alternativos:
- La API equivalente del objeto se llama de otra manera que
getName()
. - El objeto no tiene una API de Apps Script para obtener su nombre.
- No hay un objeto de Apps Script equivalente.
Cuando no se determina el tipo de objeto, el convertidor de macros crea una función nueva llamada __handle_resolve_name
en el archivo variant_resolutions.gs
.
Este es el ejemplo en código:
Código de VBA original
a = Selection.name
En este caso, se llama a la API name()
en la selección actual. La selección puede ser un objeto Hoja o un objeto Forma. Si es un objeto Hojas de cálculo, la traducción es getName()
, pero si es un objeto Shape, no hay un equivalente en Apps Script.
Código convertido de Apps Script, agregado intercalado
a = __handle_resolve_name({}, getActiveSelection(), {});
La siguiente función __handle_resolve_name()
se agrega al archivo variant_resolution.gs
para resolver diferentes tipos de objetos. La función verifica el tipo de objeto y, luego, usa getName()
si es compatible o muestra un error si no lo es.getName()
Se agregó la definición de la función al archivo 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; }
Cómo encontrar errores
Cuando te encuentras con un error en el código convertido de Apps Script, el mensaje especifica el tipo de error y su ubicación. El formato del mensaje de error depende del entorno de ejecución de Apps Script que uses.
Si estás en el entorno de ejecución predeterminado V8, verás un error similar al siguiente:
_api_windows_active (unimplemented_constructs:2:3)
Esto significa que el error se encuentra en el archivo unimplemented_constructs.gs
, en la línea 2, carácter 3.
Si estás en el entorno de ejecución de Rhino obsoleto, verás un error similar al siguiente:
unimplemented_constructs:2 (_api_windows_active)
Esto significa que el error está en el archivo unimplemented_constructs.gs
, en la línea 2.
Tipos de errores
Puedes corregir la mayoría de los errores que encuentres en los archivos unimplemented_constructs.gs
y variant_resolution.gs
descritos anteriormente.
Estos son algunos de los tipos de errores que podrías encontrar:
- API sin implementar
- Construcción de lenguaje no implementada
- API parcialmente compatible
- Se requiere trabajo manual
- Error intencional
API sin implementar
Una API sin implementar es una API que Macro Converter no puede convertir de VBA a Apps Script y no hay una solución conocida para la API.
Por lo general, las APIs sin implementar se agregan como funciones vacías (a veces con firmas
vacías) al archivo unimplemented_constructs.gs
. Si no se pudo determinar el tipo de objeto, es posible que la API sin implementar se agregue al archivo variant_resolution.gs
.
En el informe de compatibilidad que generaste antes de la conversión, esta API se etiqueta como Se necesita más investigación.
Si no corriges este tipo de API en tu código de VBA antes de convertir el archivo, así es como aparecerá en el proyecto de 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_<API_name>(param1, param2, ....) { ThrowException("APInot supported yet." ); }
Corrige errores de API no implementados
Define la API sin implementar con las APIs de Apps Script o las bibliotecas de JS existentes. Para hacerlo, sigue estos pasos:
- Abre el código de Apps Script convertido en la ubicación del error. Consulta Cómo encontrar errores.
- Arriba de la función, lee el comentario que se agregó. En algunos casos, el comentario sugiere cómo implementar la API en Apps Script.
- Si no encuentras una forma de implementar la API en Apps Script, considera quitarla de tu código.
- Si no puedes encontrar una solución alternativa o quitar esta API de tu código y la macro arroja este error, no podrás convertirla.
Ejemplos de errores de API no implementados
A continuación, se incluyen ejemplos de situaciones de API no implementadas y la manera de corregirlas:
- No hay Apps Script equivalente: Muestra una solución alternativa indirecta para
Chart.Protect
, una API que no existe en Apps Script. - Un tipo de objeto desconocido: Muestra cómo controlar un tipo de objeto que es una variable y cómo implementar un tipo de objeto no compatible que se pueda volver a crear en Apps Script.
Ejemplo 1: No hay una Apps Script equivalente o una API desconocida
En este ejemplo, Chart.Protect
no se convirtió automáticamente porque no hay una forma de proteger un gráfico en Hojas de cálculo de Google.
/** * 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.'); }
A continuación, se muestra una implementación de muestra para proteger el rango:
/** * 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(); } }
Ejemplo 2: Tipo de objeto no compatible
Cuando se desconoce el tipo de objeto, el error de API no implementado se agrega al archivo variant_resolution.gs
. En el siguiente ejemplo, se expande el ejemplo anterior de la API de name()
de VBA. Consulta variant_resolution.gs
.
En este ejemplo, aprenderás lo siguiente:
- Cómo se convierte la API de
name()
en una función nueva en el archivovariant_resolution.gs
- Cómo se llama a la función nueva en el código convertido
- Cómo crear una solución alternativa para
CommandBar
, un tipo de objeto no compatible, en Apps Script.
1. Como el código convertido no puede determinar el tipo de objeto exacto en el que se llama a name()
, Macro Converter crea una nueva función llamada __handle_resolve_name
, que se muestra a continuación.
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. Supongamos que el código VBA define una función PrintName()
que llama a la API de name()
. A continuación, se muestra el código de VBA:
‘Defining a function that prints the name of the object in parameter Sub PrintName(obj as Variant) Debug.Print obj.Name End Sub
function PrintName(obj) { Logger.log(_handle_resolve_name(obj)); }
3. Supongamos que tu código VBA llama a la función PrintName()
en el tipo de objeto CommandBar
. El código de VBA se muestra a continuación:
PrintName Application.CommandBars.item("Standard")
CommandBar
no es compatible con Apps Script y, como resultado, los dos métodos que se usan en el código de VBA anterior tampoco son compatibles.
Application.CommandBars()
: En VBA, muestra una lista de todos los objetosCommandBar
.CommandBars.item()
: En VBA, muestra un objetoCommandBar
específico.
_api_application_commandbars()
_api_commandbars_item()
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.'); }
Para que las nuevas funciones funcionen, sigue estos pasos:
3.1 Define un nuevo tipo de objeto que cree las funciones de CommandBars
y una nueva colección de CommandBars
similar a la que existe en VBA.
3.2 Agrega un método getName()
para el nuevo tipo de objeto.
Los pasos 3.1 y 3.2 se muestran en el siguiente código. Los objetos de menú se crean como un tipo de objeto nuevo que imita el comportamiento 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 Modifica la función __handle_resolve_name
en el archivo variant_resolution.gs
para controlar el nuevo tipo de objeto. Agrega una sección a la función, como se muestra
a continuación:
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 Define las dos funciones creadas en el archivo unimplemented_constructs.gs
(_api_application_commandbars()
, _api_commandbars_item()
). Este paso se asegura de que las llamadas originales de la función funcionen.
//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); }
Estructuras de lenguaje no implementadas
Una construcción es un elemento del lenguaje de código que controla el flujo de ejecución o la visualización de datos. Por ejemplo, bucles, etiquetas, eventos y saltos. Esta es una lista de todas las construcciones de VBA.
Las construcciones que el convertidor de macros no puede convertir se consideran constructos de lenguaje no implementados.
Cuando el convertidor de macros determina que existe una construcción de lenguaje no implementada, inserta un comentario TODO
.
No se admiten las siguientes construcciones de VBA:
- AddressOf
- Declarar
- DefType
- GoSub
- GoTo
- Implementa
- Lset
- Abrir
- RaiseEvent
- Nombre
- Reanudar
- Restablecer
- TypeOf
- Clase
- Módulos de clases
Se corrigieron los errores de construcción de lenguaje no implementados
- Actualiza el código para que tu lógica no dependa de la construcción de lenguaje no compatible.
- Abre el código convertido de Apps Script en la ubicación del error. Consulta Cómo encontrar errores.
- Según la lógica del código, actualízalo de una manera que no requiera la construcción de lenguaje no admitida.
- Si no encuentras una forma de reescribir el código sin la construcción de lenguaje no compatible, no podrás convertir esta macro.
Ejemplos de errores de construcción de lenguaje no implementados
Una de las construcciones de lenguaje más comunes no implementadas es una sentencia GoTo
.
Puedes reemplazar algunas sentencias GoTo
de VBA por bucles. A continuación, se muestran dos ejemplos del uso de bucles en lugar de sentencias GoTo
.
Ejemplo 1: Reemplaza GoTo
por While Loop
Código VBA original
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
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); }
Ejemplo 2: Reemplaza GoTo por un bucle For
Código VBA originalSub 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
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 parcialmente compatible
En el caso de las APIs parcialmente compatibles, algunos parámetros de entrada son compatibles con Apps Script y otros no.
Por ejemplo, la API de VBA legend_position
se usa para definir la leyenda en un gráfico de Excel. Admite varios tipos de valores de entrada, incluidos los siguientes:
xlLegendPositionBottom
: Coloca la leyenda en la parte inferior del gráfico.xlLegendPositionCorner
: Coloca la leyenda en la esquina del gráfico.xlLegendPositionCustom
: Coloca la leyenda en posiciones personalizadas del gráfico.
Apps Script tiene un código equivalente que solo admite algunos de esos valores. No se admiten los siguientes valores:
xlLegendPositionCorner
xlLegendPositionCustom
Para marcar los valores no admitidos de las APIs parcialmente admitidas en tu código convertido, se agrega una condición de validación al archivo library.gs
que busca esos valores. Por ejemplo:
if (position == xlLegendPositionCorner || position == xlLegendPositionCustom) { position = _handle_legend_position_error(position); }
Si la condición de validación encuentra uno de los valores no admitidos, se creará una función de controlador de errores, _handle_<API_name>_error
, en el archivo unimplemented_constructs.gs
.
La función muestra un error de usuario y no reemplazará el valor con un valor admitido. Por ejemplo:
/** * 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); }
Cómo corregir errores de API parcialmente admitidos
Define la función _handle_<API_name>_error
para reemplazar los valores no admitidos con una solución aceptable para tus necesidades.
- Abre el código de Apps Script convertido en la ubicación del error. Consulta Cómo encontrar errores.
- Lee el comentario sobre la función para comprender qué valores se admiten y cuáles no.
- En el caso de los valores no admitidos, determina cuáles de los valores admitidos pueden actuar como reemplazos adecuados.
- Actualiza la función
_handle_<API_name>_error
para que muestre un valor compatible en su lugar. - Si no encuentras una forma de reemplazar el valor no admitido, no podrás convertir esta macro.
Ejemplo de un error de API parcialmente admitido
En el siguiente ejemplo, se expande la API de VBA legend_position
mencionada anteriormente.
Consulta APIs parcialmente compatibles.
A continuación, se muestra un ejemplo de código VBA original que usa un valor no compatible: xlLegendPositionCustom
.
Charts(1).Legend.Position = xlLegendPositionCustom
Macro Converter agrega la siguiente función al archivo 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); }
Se requiere trabajo manual
Se necesita trabajo manual significa que la API de VBA se puede convertir en Apps Script, pero se necesita una solución alternativa.
En el informe de compatibilidad que generaste antes de la conversión, este tipo de API se etiqueta como Compatible con soluciones alternativas.
Si no corriges este tipo de API en tu código de VBA antes de convertir el archivo, así es como aparecerá en el proyecto de Apps Script:
/** * Could not convertAPI. 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_<API_name>(param1, param2, ....) { ThrowException("APInot supported yet." ); }
Corrige los errores que requieren trabajo manual
Implementa una solución alternativa para que la API funcione según lo previsto. 1. Abre el código convertido de Apps Script en la ubicación del error. Consulta Cómo encontrar errores. 1. Lee el comentario sobre la función para comprender qué APIs se pueden usar como solución alternativa. 1. Si no encuentras una solución alternativa adecuada, considera quitar la API de tu código. 1. Si no encuentras una solución alternativa o no puedes quitar esta API de tu código, y tu macro muestra un error, no podrás convertirla.
Ejemplos de errores que requieren trabajo manual
A continuación, se muestran ejemplos de APIs que arrojan errores de trabajo manual necesario y cómo corregirlos:
Implement a workaround for Autocorrect.Addreplacement
.Implement a workaround for workbook.open()
. En este ejemplo, se muestra cómo abrir archivos en Google Drive con Apps Script.
Ejemplo 1: Autocorrect.Addreplacement
En el siguiente ejemplo, se puede convertir la API de VBA Autocorrect.Addreplacement
, pero se necesita una solución alternativa. Macro Converter sugiere cómo implementar la función en los comentarios del código.
/** * 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.'); }
A continuación, se muestra la implementación de la API de Autocorrect.Addreplacement
:
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)); }
Ejemplo 2: Workbook.open()
La API de VBA workbook.open()
abre un archivo local según una ruta de acceso.
Supongamos que workbook.open()
abre dos archivos en el código de VBA:
- Archivo 1:
C:\Data\abc.xlsx
- Archivo 2:
C:\Data\xyz.xlsx
A continuación, se muestra cómo Macro Converter reemplaza Workbook.open()
con Apps Script en cualquier lugar en que se use Workbook.open()
para abrir el archivo 1:
var spreadSheetId = _handle_mso_excel_get_google_spreadsheet_id("C:\Data\abc.xlsx"); var spreadSheet = SpreadsheetApp.openById(spreadSheetId);
unimplemented_constructs.gs
en el proyecto de 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 '' ; }
Según lo que indican los comentarios del ejemplo anterior, debes convertir los archivos de destino en archivos de Hojas de cálculo de Google en Google Drive.
Los ID de las hojas de cálculo de Google correspondientes aparecen en negrita a continuación:
- Archivo n.° 1:
C:\Data\abc.xlsx
se convierte enhttps://docs.google.com/spreadsheets/d/abc123Abc123Abc123abc
- Archivo 2:
C:\Data\abc.xlsx
se convierte enhttps://docs.google.com/spreadsheets/d/xyz456Xyz456xYz456xyZ
Luego, modifica el código en la función de Apps Script para abrir los archivos por ID, como se muestra a continuación:
/** * 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"; }
Error intencional
Se agregan errores intencionales al código convertido para imitar el comportamiento de error del código VBA original. No es necesario que modifiques estos errores.
Ejemplo de un error intencional
Si intentas acceder a un elemento más allá de los límites de un array en VBA, el código arrojará una excepción. En Apps Script, el código muestra un valor indefinido.
Para evitar resultados inesperados, el convertidor de macros agrega código de Apps Script que arroja una excepción si intentas acceder a elementos más allá de los límites de un array.
Este ejemplo se muestra en el siguiente código:
Código VBA originalDim arr arr = Array("apple", "orange") MsgBox arr(5) Will throw the following error: Subscript out of range
var arr; arr = ["apple", "orange"]; Browser.msgBox(arr[5]); Will return this value and not throw an error: undefined
/** * 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));
Artículos relacionados
- Descripción general del complemento Macro Converter
- Determina si las macros de VBA son compatibles
- Cómo convertir macros de VBA a Apps Script
- Cómo resolver problemas habituales
- Mira instructivos de Macro Converter
- Lista de APIs de VBA compatibles