He estado usando una macro en un Excel durante algunos años y quería traducirla en un script de Google para colaborar en Drive.
Estoy usando una configuración de dos hojas (una llamada "BILAN", que es la descripción general y otra llamada INPUT para ingresar datos. El script funciona bien mientras no hay demasiadas entradas, pero espero alcanzar cerca de mil entradas al final del uso del archivo.
Básicamente, el guión es un doble bucle para resumir las entradas en la hoja BILAN. Gracias de antemano por tu ayuda !!
Aquí está el código que estoy usando:
function getTransportDates() { var ss = SpreadsheetApp.getActive(); var strDatesTransport = ''; const intNbClients = ss.getSheetByName('BILAN').getDataRange().getLastRow(); const intNbInputs = ss.getSheetByName('INPUT').getDataRange().getLastRow(); for (let i = 4; i <= intNbClients; i++) { // loop through the addresses in BILAN if (ss.getSheetByName('BILAN').getRange(i, 9).getValue() >0) { for (let j = 4; j <= intNbInputs; j++) { // loop through the adresses in INPUT if (ss.getSheetByName('INPUT').getRange(j, 2).getValue() == ss.getSheetByName('BILAN').getRange(i, 1).getValue()) { strDatesTransport = strDatesTransport + ' // ' + ss.getSheetByName('INPUT').getRange(j, 1).getValue(); //.toISOString().split('T')[0]; } } } ss.getSheetByName('BILAN').getRange(i, 10).setValue(strDatesTransport); strDatesTransport = ''; } };Cada vez que el intérprete llega a algo como esto:
ss.getSheetByName('INPUT')... tiene que ir a la Hoja de Google para ver si hay (actualmente) una hoja con ese nombre, y luego tiene que encontrar la celda relevante dentro de esa hoja. Aunque el script se ejecuta en un servidor de Google, acceder a una hoja de cálculo lleva más tiempo que acceder a una variable dentro del entorno Javascript local.
La forma más sencilla de reducir el número de llamadas es leer cada una de las hojas ("BILAN" e "INPUT") en una variable Javascript local.
De hecho, me parece que está extrayendo conjuntos de celdas extremadamente específicos de cada una de las hojas de cálculo. ¿Podría obtener cada conjunto de celdas en una matriz y luego procesar las matrices?
Pruébalo de esta manera:
function getTransportDates() { const ss = SpreadsheetApp.getActive(); var sdt = ''; const csh = ss.getSheetByName('BILAN'); const cvs = csh.getRange(4, 1, csh.getLastRow() - 3, csh.getLastColumn()).getValues(); const ish = ss.getSheetByName('INPUT'); const ivs = ish.getRange(4, 1, ish.getLastRow() - 3, ish.getLastColumn()).getValues(); cvs.forEach((cr,i) => { if((cr[8] > 0)) { ivs.forEach((ir,j)=>{ if(ir[1] == cr[0]) { sdt += ir[0]; } }); } ss.getSheetByName('BILAN').getRange(i + 4, 10).setValue(sdt); sdt = ''; }); } No sé a dónde va esto: //.toISOString().split('T')[0];