Trabajo con varios intervalos de forma simultánea en los complementos de Excel
La biblioteca de JavaScript de Excel permite al complemento realizar operaciones y establecer propiedades en varios intervalos simultáneamente. Los intervalos no tienen que ser contiguos. Además de hacer que el código sea más sencillo, esta forma de configurar una propiedad es mucho más rápida que establecer la misma propiedad por separado para cada uno de los intervalos.
RangeAreas
Un conjunto de intervalos (posiblemente no contiguos) se representa mediante un objeto RangeAreas . Tiene métodos y propiedades similares al tipo Range
(muchos con los mismos nombres o similares), pero se han realizado ajustes en:
- Los tipos de datos de propiedades y comportamientos de los captadores y definidores.
- Los tipos de datos de los parámetros de método y los comportamientos de método.
- Los tipos de datos del método devuelven valores.
Por ejemplo:
-
RangeAreas
tiene una propiedadaddress
que devuelve una cadena delimitada por comas de direcciones de intervalos, en lugar de una sola dirección como con la propiedadRange.address
. -
RangeAreas
tiene una propiedaddataValidation
que devuelve un objetoDataValidation
que representa la validación de datos de todos los intervalos deRangeAreas
, si es coherente. La propiedad esnull
si no se aplican objetosDataValidation
idénticos a todos los intervalos deRangeAreas
. Este es un principio general, pero no universal, con elRangeAreas
objeto : si una propiedad no tiene valores coherentes en todos los intervalos deRangeAreas
, esnull
. Consulte Read properties of RangeAreas (Leer propiedades de RangeAreas ) para obtener más información y algunas excepciones. -
RangeAreas.cellCount
obtiene el número total de celdas de todos los intervalos deRangeAreas
. -
RangeAreas.calculate
actualiza las celdas de todos los intervalos deRangeAreas
. -
RangeAreas.getEntireColumn
yRangeAreas.getEntireRow
devuelven otro objetoRangeAreas
que representa todas las columnas (o filas) en todos los intervalos deRangeAreas
. Por ejemplo, siRangeAreas
representa "A1: C4" y "F14:L15",RangeAreas.getEntireColumn
devuelve un objetoRangeAreas
que representa "A:C" y "F:L". -
RangeAreas.copyFrom
puede tomar unRange
parámetro o queRangeAreas
represente los intervalos de origen de la operación de copia.
Lista completa de los miembros del intervalo que también están disponibles en RangeAreas
Propiedades
Familiarícese con Leer las propiedades de RangeAreas antes de escribir código que lea las propiedades de la lista. Hay matices con respecto a lo que se devuelve.
address
addressLocal
cellCount
conditionalFormats
context
dataValidation
format
isEntireColumn
isEntireRow
style
worksheet
Métodos
calculate()
clear()
convertDataTypeToText()
convertToLinkedDataType()
copyFrom()
getEntireColumn()
getEntireRow()
getIntersection()
getIntersectionOrNullObject()
-
getOffsetRange()
(denominadogetOffsetRangeAreas
en elRangeAreas
objeto ) getSpecialCells()
getSpecialCellsOrNullObject()
getTables()
-
getUsedRange()
(denominadogetUsedRangeAreas
en elRangeAreas
objeto ) -
getUsedRangeOrNullObject()
(denominadogetUsedRangeAreasOrNullObject
en elRangeAreas
objeto ) load()
set()
setDirty()
toJSON()
track()
untrack()
Métodos y propiedades específicos de RangeArea
El tipo RangeAreas
tiene algunas propiedades y métodos que no están en el objeto Range
. A continuación se muestra una selección de ellos.
-
areas
: un objetoRangeCollection
que contiene todos los intervalos representados por el objetoRangeAreas
. El objetoRangeCollection
también es nuevo y es similar a otros objetos de la colección de Excel. Tiene una propiedaditems
que es una matriz de objetosRange
que representan los intervalos. -
areaCount
: el número total de eventos de intervalos deRangeAreas
. -
getOffsetRangeAreas
: funciona igual que Range.getOffsetRange, excepto que se devuelve unRangeAreas
y contiene intervalos que se desplazan de uno de los intervalos delRangeAreas
original.
Crear RangeAreas
Puede crear un objeto RangeAreas
de dos formas básicas:
- Llame a
Worksheet.getRanges()
y pásele una cadena con direcciones de intervalo delimitadas por comas. Si cualquier intervalo que desee incluir se ha realizado en un NamedItem, puede incluir el nombre, en lugar de la dirección, en la cadena. - Llame a
Workbook.getSelectedRanges()
. Este método devuelve unRangeAreas
que representa todos los intervalos seleccionados en la hoja de cálculo activa.
Cuando tenga un objeto RangeAreas
, puede crear otros con los métodos en el objeto que devuelve RangeAreas
como getOffsetRangeAreas
y getIntersection
.
Nota:
No puede agregar directamente intervalos adicionales a un objeto RangeAreas
. Por ejemplo, la colección de RangeAreas.areas
no tiene un método add
.
Advertencia
No intente agregar o eliminar miembros de la matriz RangeAreas.areas.items
directamente. Esto provocará un comportamiento no deseado en el código. Por ejemplo, es posible insertar un objeto Range
adicional en la matriz, pero si lo hace, producirá errores porque los métodos y propiedades de RangeAreas
se comportan como si el nuevo elemento no existiese. Por ejemplo, la propiedad areaCount
no incluye intervalos insertados de esta forma y se produce un error de RangeAreas.getItemAt(index)
si index
es mayor que areasCount-1
. De forma similar, al eliminar un objeto Range
en la matriz RangeAreas.areas.items
obteniendo una referencia a él y llamando a su método Range.delete
se producen errores: aunque el objeto Range
se elimina, las propiedades y métodos del objeto RangeAreas
primario se comportan, o intentan hacerlo, como si siguiese existiendo. Por ejemplo, si el código llama a RangeAreas.calculate
, Office intentará calcular el intervalo, pero se producirá un error porque el objeto de intervalo ha desaparecido.
Establecer propiedades en varios rangos
Establecer una propiedad de un objeto RangeAreas
establece la propiedad correspondiente en todos los intervalos de la colección de RangeAreas.areas
.
Este es un ejemplo del establecimiento de una propiedad en varios intervalos. La función resalta los intervalos F3:F5 y H3:H5.
await Excel.run(async (context) => {
let sheet = context.workbook.worksheets.getActiveWorksheet();
let rangeAreas = sheet.getRanges("F3:F5, H3:H5");
rangeAreas.format.fill.color = "pink";
await context.sync();
});
Este ejemplo se aplica a los escenarios donde se pueden codificar las direcciones del intervalo que se pasan a getRanges
o calcularlas fácilmente en tiempo de ejecución. Algunos de los escenarios en los que esto puede ocurrir son:
- El código se ejecuta en el contexto de una plantilla conocida.
- El código se ejecuta en el contexto de datos importados donde se conoce el esquema de los datos.
Obtener celdas especiales de varios rangos
Los métodos getSpecialCells
y getSpecialCellsOrNullObject
en el objeto RangeAreas
funcionan de forma análoga a los métodos del mismo nombre en el objeto Range
. Estos métodos devuelven las celdas con la característica especificada de todos los rangos de la colección RangeAreas.areas
. Para obtener más detalles sobre las celdas especiales, vea Buscar celdas especiales dentro de un rango.
Cuando se llama al método getSpecialCells
o getSpecialCellsOrNullObject
en un objeto RangeAreas
:
- Si pasa
Excel.SpecialCellType.sameConditionalFormat
como primer parámetro, el método devuelve todas las celdas con el mismo formato condicional que la celda superior izquierda del primer rango en la colecciónRangeAreas.areas
. - Si pasa
Excel.SpecialCellType.sameDataValidation
como primer parámetro, el método devuelve todas las celdas con la misma validación de datos que la celda superior izquierda del primer rango en la colecciónRangeAreas.areas
.
Lectura de propiedades de RangeAreas
Es necesario prestar atención al leer los valores de propiedad de RangeAreas
, ya que una propiedad determinada puede tener diferentes valores para diferentes intervalos de RangeAreas
. La regla general es que, si un valor coherente puede devolverse, se devolverá. Por ejemplo, en el código siguiente, el código RGB para rosa (#FFC0CB
) y true
se registrará en la consola porque ambos rangos del RangeAreas
objeto tienen un relleno rosa y ambos son columnas completas.
await Excel.run(async (context) => {
let sheet = context.workbook.worksheets.getActiveWorksheet();
// The ranges are the F column and the H column.
let rangeAreas = sheet.getRanges("F:F, H:H");
rangeAreas.format.fill.color = "pink";
rangeAreas.load("format/fill/color, isEntireColumn");
await context.sync();
console.log(rangeAreas.format.fill.color); // #FFC0CB
console.log(rangeAreas.isEntireColumn); // true
});
Las cosas se vuelven más complicadas cuando no es posible mantener la coherencia. El comportamiento de las propiedades de RangeAreas
sigue estos tres principios:
- Una propiedad booleana de un objeto
RangeAreas
devuelvefalse
a menos que la propiedad tenga un valor true para todos los intervalos del miembro. - Las propiedades no booleanas, con la excepción de la propiedad
address
, devuelvennull
a menos que la propiedad correspondiente en todos los intervalos de miembro tengan el mismo valor. - La propiedad
address
devuelve una cadena delimitada por comas de las direcciones de los intervalos del miembro.
Por ejemplo, el siguiente código crea un RangeAreas
donde solo un intervalo es una columna completa y solo uno se rellena con color rosa. La consola mostrará null
para el color de relleno, false
para la propiedad isEntireRow
y "Hoja1!F3:F5, Hoja1!H:H" (suponiendo que el nombre de la hoja es "Hoja1") para la propiedad address
.
await Excel.run(async (context) => {
let sheet = context.workbook.worksheets.getActiveWorksheet();
let rangeAreas = sheet.getRanges("F3:F5, H:H");
let pinkColumnRange = sheet.getRange("H:H");
pinkColumnRange.format.fill.color = "pink";
rangeAreas.load("format/fill/color, isEntireColumn, address");
await context.sync();
console.log(rangeAreas.format.fill.color); // null
console.log(rangeAreas.isEntireColumn); // false
console.log(rangeAreas.address); // "Sheet1!F3:F5, Sheet1!H:H"
});