Hola a todos, qué tal estáis? espero que bien. Hoy voy a modificar y actualizar otro script asíncrono heredado al modelo actual del API.
El post que vamos a modificar es este: EJEMPLO PRÁCTICO DE ALGUNOS CÁLCULOS CON TYPESCRIPT
Es un post muy interesante por varias razones: Contiene multitud de métodos y ejemplos de propiedades y además es un caso práctico en el que calculo el coste seguridad social empresa de algunos empleados en un determinado caso. Os recomiendo que lo leáis.
El script que os propongo como actualización es el siguiente:
async function main(workbook: ExcelScript.Workbook) {
//asignamos variables para hojas 1 y 2
let Origen = workbook.getWorksheet("Hoja1");
let Destino = workbook.getWorksheet("Hoja2");
//cargamos valores de filas y columnas
let MiRangoRow = Origen.getUsedRange();
let MiRangoColumn = Origen.getUsedRange();
//contamos filas y columnas
let FinRow = MiRangoRow.getRowCount();
let FinColumn = MiRangoColumn.getColumnCount();
let encabezados = Origen.getRangeByIndexes(0, 0, 1, FinColumn);
let ndatos = Origen.getRangeByIndexes(1, 0, FinRow - 1, FinColumn);
//asignamos variables para el conjunto de datos y los encabezados
let MisDatos = ndatos.getValues();
let MiEncabezado = encabezados.getValues();
//Pasamos encabezados y datos a hoja Destino
Destino.getRangeByIndexes(0, 0, 1, FinColumn).setValues(MiEncabezado);
Destino.getRangeByIndexes(1, 0, FinRow - 1, FinColumn).setValues(MisDatos);
//Añadimos titulos en columnas 2 y 3
Destino.getCell(0, 2).setValues([
["SEG. SOCIAL EMPRESA"]
]);
Destino.getCell(0, 3).setValues([
["TOTAL"]
]);
//Obtenemos valores columna 1 y 2
let Base = Destino.getRangeByIndexes(1, 1, FinRow - 1, 1).getValues();
let sEmpresa = Destino.getRangeByIndexes(1, 2, FinRow - 1, 1).getValues();
//Calculamos S.Social empresa y suma columnas 1 y 2
for (let i = 1; i < FinRow; i++) {
Destino.activate();
let nBase = Base[i - 1];
if (nBase <
[48841, 2]
) {
Destino.getCell(i, 2).setFormulas([
["=B" + (i + 1) + "*33.5/100"]
])
} else {
Destino.getCell(i, 2).setFormulas([
["=" + "48841.2" + " * 33.5 / 100"]
])
}
let MisEmpresa = sEmpresa[i];
Destino.getCell(i, 3).setFormulas([
["=B" + (i + 1) + "+" + "C" + (i + 1)]
])
}
Destino.getRangeByIndexes(1, 1, FinRow, 3).setNumberFormatLocal("#.##0,00 €")
//Calculamos totales
Destino.getCell(FinRow, 1).setFormulas([
["=SUM(B2:B" + FinRow + ")"]
])
Destino.getCell(FinRow, 2).setFormulas([
["=SUM(C2:C" + FinRow + ")"]
])
Destino.getCell(FinRow, 3).setFormulas([
["=SUM(D2:D" + FinRow + ")"]
])
//Resaltamos totales
Destino.getRange("B" + (FinRow + 1) + ":" + "D" + (FinRow + 1)).getFormat().getFont().setBold(true);
}
Funciona perfectamente y realiza un cálculo preciso según el modelo que he elegido.
Y esto es todo, espero que sea de utilidad.
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
Estoy probando codigo en office online con scriptlab y no me funciona, Ahora hay que escribir el código así:
$(«#run»).click(() => tryCatch(run));
async function run() {
await Excel.run(async (context) => {
}
** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
try {
await callback();
} catch (error) {
// Note: In a production add-in, you’d want to notify the user through your add-in’s UI.
console.error(error);
}
}
y no funciona getValues, el error me dice que la propiedad no se puede asignar a un rango
¿Qué sucede?, no encuentro documentación en ningún sitio para resolver el problema.
Gracias
Ese código es para ejecutar en la pestaña de Automatizar de office Online, y funciona perfectamente, acabo de ejecutarlo y va sin problema.
Para Script lab tengo desarrollada una función: https://excelsignum.com/2020/12/08/crear-udf-en-excel-online-con-typescript-usando-script-lab/
Saludos.
Muchas gracias. No dudaba en absoluto del funcionamiento del código de Automatizar de Office online, si no del por qué no funcionaba en scriptlab.
Gracias a usted ya entiendo que con la versión de 365 personal o familiar no se puede usar los scripts en scriptlab, si no de otra forma específica.
un saludo y feliz año!!!
Solo se pueden crear UDFS con scriptlab y equivocádamente pensba que se podía aplicar el mismo código de TypeScript para crear scripts.
No obstante, está todo en continuo desarrollo y de un momento para otro introducen novedades. Puedes seguir lo que se va publicando en https://support.microsoft.com/es-es/office/introducci%C3%B3n-a-los-scripts-de-office-en-excel-9fbe283d-adb8-4f13-a75b-a81c6baf163a
O también, dentro de lo que puedo contribuir, es esta web.
Saludos y estamos en contacto.