Conservar el estado y la configuración del complemento
Los complementos de Office son básicamente aplicaciones web que se ejecutan en el entorno sin estado de un iframe del explorador o un control de vista web. (En adelante, para mayor brevedad, en este artículo se usa "control de explorador" para significar "control de explorador o vista web"). Cuando está en uso, es posible que el complemento tenga que conservar los datos para mantener la continuidad de determinadas operaciones o características entre sesiones. Por ejemplo, es posible que su complemento tenga configuraciones personalizadas u otros valores que necesite guardar y recargar la próxima vez que se inicialice, como puede ser la vista preferida de un usuario o una ubicación predeterminada. Para hacerlo, puede:
- Use técnicas proporcionadas por el control del explorador subyacente.
- Use las API de JavaScript de Office específicas de la aplicación para Excel, Word y Outlook que almacenan datos.
Si necesita conservar el estado de los documentos, como el seguimiento de las preferencias del usuario en todos los documentos que abran, deberá usar un enfoque diferente. Por ejemplo, podría usar el inicio de sesión único para obtener la identidad del usuario y, a continuación, guardar el identificador de usuario y su configuración en una base de datos en línea.
Almacenamiento del explorador
Conservar datos en instancias de complemento con herramientas del control de explorador subyacente, como cookies de explorador o almacenamiento web HTML5 (localStorage o sessionStorage).
Algunos exploradores o la configuración del explorador del usuario pueden bloquear las técnicas de almacenamiento basadas en exploradores. Debe probar la disponibilidad como se documenta en Uso de la API de almacenamiento web.
Creación de particiones de almacenamiento
Como procedimiento recomendado, los datos privados deben almacenarse en particiones localStorage
.
Office.context.partitionKey proporciona una clave para su uso con el almacenamiento local. Esto garantiza que los datos almacenados en el almacenamiento local solo estén disponibles en el mismo contexto. En el ejemplo siguiente se muestra cómo usar la clave de partición con localStorage
. Tenga en cuenta que la clave de partición no está definida en entornos sin particiones, como los controles del explorador para aplicaciones windows.
// Store the value "Hello" in local storage with the key "myKey1".
setInLocalStorage("myKey1", "Hello");
// ...
// Retrieve the value stored in local storage under the key "myKey1".
const message = getFromLocalStorage("myKey1");
console.log(message);
// ...
function setInLocalStorage(key: string, value: string) {
const myPartitionKey = Office.context.partitionKey;
// Check if local storage is partitioned.
// If so, use the partition to ensure the data is only accessible by your add-in.
if (myPartitionKey) {
localStorage.setItem(myPartitionKey + key, value);
} else {
localStorage.setItem(key, value);
}
}
function getFromLocalStorage(key: string) {
const myPartitionKey = Office.context.partitionKey;
// Check if local storage is partitioned.
if (myPartitionKey) {
return localStorage.getItem(myPartitionKey + key);
} else {
return localStorage.getItem(key);
}
}
A partir de la versión 115 de los exploradores basados en Chromium, como Chrome y Edge, la creación de particiones de almacenamiento está habilitada para evitar el seguimiento entre sitios de canal lateral específico (consulte también las directivas del explorador Microsoft Edge). De forma similar a la creación de particiones basada en claves de Office, los datos almacenados por las API de almacenamiento, como el almacenamiento local, solo están disponibles para contextos con el mismo origen y el mismo sitio de nivel superior.
Configuración y persistencia específicas de la aplicación
Excel, Word y Outlook proporcionan API específicas de la aplicación para guardar la configuración y otros datos. Use estas en lugar de las API comunes mencionadas más adelante en este artículo para que el complemento siga patrones coherentes y esté optimizado para la aplicación de destino.
Configuración en Excel y Word
Las API de JavaScript específicas de la aplicación para Excel y Word también proporcionan acceso a la configuración personalizada. La configuración es única para un único emparejamiento de archivos y complementos de Excel. Para obtener más información, vea Excel.SettingCollection y Word.SettingCollection.
En el ejemplo siguiente se muestra cómo crear y acceder a una configuración en Excel. El proceso es funcionalmente equivalente en Word, que usa Document.settings en lugar de Workbook.settings
.
await Excel.run(async (context) => {
const settings = context.workbook.settings;
settings.add("NeedsReview", true);
const needsReview = settings.getItem("NeedsReview");
needsReview.load("value");
await context.sync();
console.log("Workbook needs review : " + needsReview.value);
});
Datos XML personalizados en Excel y Word
Los formatos de archivo .xlsx y .docx de Open XML permiten que el complemento inserte datos XML personalizados en el libro de Excel o en el documento de Word. Estos datos se conservan con el archivo, independientemente del complemento.
Word.Document y Excel.Workbook contienen , CustomXmlPartCollection
que es una lista de CustomXmlParts
. Estos dan acceso a las cadenas XML y a un único identificador correspondiente. Al almacenar estos identificadores como configuración, el complemento puede mantener las claves de los elementos XML entre sesiones.
En los ejemplos siguientes se muestra cómo usar elementos XML personalizados con un libro de Excel. El primer bloque de código muestra cómo insertar datos XML. Almacena una lista de revisores y luego, usa la configuración del libro para guardar el id
del XML para una recuperación futura. El segundo bloque muestra cómo acceder a ese XML más adelante. La configuración de "ContosoReviewXmlPartId" se carga y se pasa al customXmlParts
del libro. Luego, los datos XML se imprimen en la consola. El proceso es funcionalmente equivalente en Word, que usa Document.customXmlParts en lugar de Workbook.customXmlParts
.
await Excel.run(async (context) => {
// Add reviewer data to the document as XML
const originalXml = "<Reviewers xmlns='http://schemas.contoso.com/review/1.0'><Reviewer>Juan</Reviewer><Reviewer>Hong</Reviewer><Reviewer>Sally</Reviewer></Reviewers>";
const customXmlPart = context.workbook.customXmlParts.add(originalXml);
customXmlPart.load("id");
await context.sync();
// Store the XML part's ID in a setting
const settings = context.workbook.settings;
settings.add("ContosoReviewXmlPartId", customXmlPart.id);
});
Nota:
CustomXMLPart.namespaceUri
solo se rellena si el elemento XML personalizado en el nivel superior contiene el atributo xmlns
.
Propiedades personalizadas en Excel y Word
Las propiedades Excel.DocumentProperties.custom y Word.DocumentProperties.customProperties representan colecciones de pares clave-valor para propiedades definidas por el usuario. En el siguiente ejemplo de Excel se muestra cómo crear una propiedad personalizada denominada Introduction con el valor "Hello" y, a continuación, recuperarla.
await Excel.run(async (context) => {
const customDocProperties = context.workbook.properties.custom;
customDocProperties.add("Introduction", "Hello");
await context.sync();
});
// ...
await Excel.run(async (context) => {
const customDocProperties = context.workbook.properties.custom;
const customProperty = customDocProperties.getItem("Introduction");
customProperty.load(["key", "value"]);
await context.sync();
console.log("Custom key : " + customProperty.key); // "Introduction"
console.log("Custom value : " + customProperty.value); // "Hello"
});
Sugerencia
En Excel, las propiedades personalizadas también se pueden establecer en el nivel de hoja de cálculo con la propiedad Worksheet.customProperties . Son similares a las propiedades personalizadas de nivel de documento, salvo que la misma clave se puede repetir en distintas hojas de cálculo.
Cómo guardar la configuración en un complemento de Outlook
Para obtener información sobre cómo guardar la configuración en un complemento de Outlook, vea Obtener y establecer metadatos de complemento para un complemento de Outlook y Obtener y establecer encabezados de Internet en un mensaje en un complemento de Outlook.
Configuración y persistencia de API comunes
Las API comunes proporcionan objetos para guardar el estado del complemento entre sesiones. Los valores de configuración guardados están asociados con el identificador del complemento que los creó. Internamente, los datos a los que se accede con los Settings
objetos , CustomProperties
o RoamingSettings
se almacenan como un objeto de notación de objetos JavaScript serializado (JSON) que contiene pares nombre-valor. El nombre (clave) de cada valor debe ser , string
y el valor almacenado puede ser una función de JavaScript string
, number
, date
o , pero object
no una función.
Este ejemplo de la estructura del contenedor de propiedades contiene tres valores de cadena definidos denominados firstName
, location
y defaultView
.
{
"firstName":"Erik",
"location":"98052",
"defaultView":"basic"
}
Después de que se haya guardado el contenedor de propiedades de configuración durante la sesión anterior del complemento, puede cargarse al iniciar la aplicación o en cualquier momento posterior, durante la sesión actual del complemento. Durante la sesión, la configuración se administra completamente en la memoria mediante los get
métodos , set
y remove
del objeto que corresponde al tipo de configuración que se va a crear (Configuración, CustomProperties o RoamingSettings).
Importante
Para conservar las adiciones, actualizaciones o eliminaciones realizadas durante la sesión actual del complemento en la ubicación de almacenamiento, debe llamar al saveAsync
método del objeto correspondiente utilizado para trabajar con ese tipo de configuración. Los get
métodos , set
y remove
solo funcionan en la copia en memoria del contenedor de propiedades de configuración. Si el complemento se cierra sin llamar a saveAsync
, se perderán los cambios realizados en la configuración durante esa sesión.
Procedimiento para guardar la configuración y el estado de los complementos por cada documento de los complementos de panel de tareas y de contenido
Para conservar la configuración personalizada o de estado de un complemento de contenido o panel de tareas para Word, Excel o PowerPoint, use el objeto Settings y sus métodos. El contenedor de propiedades creado con los métodos del Settings
objeto solo está disponible para la instancia del complemento de contenido o panel de tareas que lo creó y solo desde el documento en el que se guarda.
El Settings
objeto se carga automáticamente como parte del objeto Document y está disponible cuando se activa el panel de tareas o el complemento de contenido. Después de crear una instancia del Document
objeto, puede acceder al Settings
objeto con la propiedad settings del Document
objeto. Durante la duración de la sesión, puede usar los Settings.get
métodos , Settings.set
y Settings.remove
para leer, escribir o quitar la configuración persistente y el estado del complemento de la copia en memoria del contenedor de propiedades.
Dado que los métodos set y remove solo funcionan con la copia en memoria del contenedor de propiedades de configuración, para guardar la configuración nueva o modificada en el documento al que está asociado el complemento, debe llamar al método Settings.saveAsync .
Creación o actualización de un valor de configuración
En el ejemplo de código siguiente se muestra cómo usar el método Settings.set para crear una configuración llamada 'themeColor'
con el valor 'green'
. El primer parámetro del método set es el nombre (Id) que distingue mayúsculas de minúsculas de la configuración que se va a establecer o crear. El segundo parámetro es el valor (value) de la configuración.
Office.context.document.settings.set('themeColor', 'green');
Si la configuración no existe aún, se crea una con el nombre especificado o, si ya existe, se actualiza su valor. Use el Settings.saveAsync
método para conservar la configuración nueva o actualizada en el documento.
Obtener el valor de una configuración
En el ejemplo siguiente se muestra cómo usar el método Settings.get para obtener el valor de una configuración llamada "themeColor". El único parámetro del get
método es el nombre que distingue mayúsculas de minúsculas de la configuración.
write('Current value for mySetting: ' + Office.context.document.settings.get('themeColor'));
// Function that writes to a div with id='message' on the page.
function write(message){
document.getElementById('message').innerText += message;
}
El get
método devuelve el valor que se guardó anteriormente para el nombre de configuración que se pasó. Si la configuración no existe, el método devuelve null.
Quitar una configuración
En el ejemplo siguiente se muestra cómo usar el método Settings.remove para quitar una configuración llamada "themeColor". El único parámetro del remove
método es el nombre que distingue mayúsculas de minúsculas de la configuración.
Office.context.document.settings.remove('themeColor');
No ocurrirá nada si la configuración no existe. Use el Settings.saveAsync
método para conservar la eliminación de la configuración del documento.
Guardar la configuración
Para guardar las adiciones, cambios o eliminaciones que realice el complemento en la copia en memoria del contenedor de propiedades de la configuración durante la sesión actual, es necesario llamar al método Settings.saveAsync para almacenarlos en el documento. El único parámetro del método es la saveAsync
devolución de llamada, que es una función de devolución de llamada con un único parámetro.
Office.context.document.settings.saveAsync(function (asyncResult) {
if (asyncResult.status == Office.AsyncResultStatus.Failed) {
write('Settings save failed. Error: ' + asyncResult.error.message);
} else {
write('Settings saved.');
}
});
// Function that writes to a div with id='message' on the page.
function write(message){
document.getElementById('message').innerText += message;
}
La función anónima que se pasa al saveAsync
método como parámetro de devolución de llamada se ejecuta cuando se completa la operación. El parámetro asyncResult de la devolución de llamada proporciona acceso a un AsyncResult
objeto que contiene el estado de la operación. En el ejemplo, la función comprueba la AsyncResult.status
propiedad para ver si la operación de guardado se realizó correctamente o no y, a continuación, muestra el resultado en la página del complemento.
Cómo guardar XML personalizado en el documento
Un elemento XML personalizado es una opción de almacenamiento disponible para cuando quiera almacenar información que tenga un carácter estructurado o necesite que los datos sean accesibles entre las instancias del complemento. Tenga en cuenta que otros complementos también pueden acceder a los datos almacenados de esta manera. Puede conservar el marcado XML personalizado en un complemento de panel de tareas para Word (y para Excel y Word mediante la API específica de la aplicación, como se mencionó en el párrafo anterior). En Word, puede usar el objeto CustomXmlPart y sus métodos. El código siguiente crea un elemento XML personalizado y muestra su identificador y, a continuación, su contenido en divs en la página. Tenga en cuenta que debe haber un xmlns
atributo en la cadena XML.
function createCustomXmlPart() {
const xmlString = "<Reviewers xmlns='http://schemas.contoso.com/review/1.0'><Reviewer>Juan</Reviewer><Reviewer>Hong</Reviewer><Reviewer>Sally</Reviewer></Reviewers>";
Office.context.document.customXmlParts.addAsync(xmlString,
(asyncResult) => {
$("#xml-id").text("Your new XML part's ID: " + asyncResult.value.id);
asyncResult.value.getXmlAsync(
(asyncResult) => {
$("#xml-blob").text(asyncResult.value);
}
);
}
);
}
Para recuperar un elemento XML personalizado, use el método getByIdAsync , pero el identificador es un GUID que se genera cuando se crea el elemento XML, por lo que no puede saber cuándo codificar cuál es el identificador. Por ese motivo, se recomienda crear un elemento XML para almacenar inmediatamente el identificador del elemento XML como una configuración y darle una clave memorable. En el siguiente método se indica cómo hacerlo.
function createCustomXmlPartAndStoreId() {
const xmlString = "<Reviewers xmlns='http://schemas.contoso.com/review/1.0'><Reviewer>Juan</Reviewer><Reviewer>Hong</Reviewer><Reviewer>Sally</Reviewer></Reviewers>";
Office.context.document.customXmlParts.addAsync(xmlString,
(asyncResult) => {
Office.context.document.settings.set('ReviewersID', asyncResult.value.id);
Office.context.document.settings.saveAsync();
}
);
}
El código siguiente muestra cómo recuperar el elemento XML obteniendo en primer lugar su identificador de una configuración.
function getReviewers() {
const reviewersXmlId = Office.context.document.settings.get('ReviewersID');
Office.context.document.customXmlParts.getByIdAsync(reviewersXmlId,
(asyncResult) => {
asyncResult.value.getXmlAsync(
(asyncResult) => {
$("#xml-blob").text(asyncResult.value);
}
);
}
);
}