¿Cómo hago un bucle para agregar el mes a cada fecha hasta que se cumpla la condición?
Explicación: quiero agregar 3 meses a cada fecha cada vez hasta que la columna anual (columna D) sea mayor que la fecha de hoy (columna E).
Ejemplo: si tomamos la primera línea de la columna Anual "01/02/2021" y agregamos los primeros 3 meses, los resultados serán el 01/05/2021, luego agregamos la segunda vez 3 meses 01/08/2021 ..etc hasta que sea el 05/01/2022 (mayor que la fecha de hoy).
En la columna "H" he escrito los resultados que quiero, pero lo que tengo está en la columna "F" de Red.
Aquí está mi código:
function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); for (var i = 2; i < 12; i++) { var today_date = ss.getRange(i, 5).getValue(); var today_date_format = Utilities.formatDate(new Date(today_date), "Europe/Paris", 'MMMM dd, yyyy 12:00:00 Z'); var Date_2021 = ss.getRange(i, 4).getValue(); var Date_2021_Format = Utilities.formatDate(new Date(Date_2021), "Europe/Paris", 'MMMM dd, yyyy 12:00:00 Z'); var Date_2021_constructed = new Date(Date_2021_Format); var a3date = Date_2021_constructed.getMonth(); Date_2021_constructed.setMonth((a3date + 3) % 12); do { Date_2021_constructed = Date_2021_constructed.setMonth((a3date + 3) % 12); } while (Date_2021_constructed > today_date_format); ss.getRange(i, 6).setValue(Date_2021_constructed) } }Aquí está la pantalla de mis datos:
Gracias por el ejemplo y la imagen que ayuda mucho:
Voy a sugerir una solución rápida y ver si funciona. Parece que puede estar publicando el valor de la fecha en milisegundos en la columna f. Así que prueba esto:
ss.getRange(i, 6).setValue(new Date(Date_2021_constructed)).setNumberFormat("dd/MM/yyyy");
Si esto no funciona, lo miraré más de cerca y sería útil tener una tabla de valores de su hoja de cálculo para poder probar.
Si la solución anterior no funciona, intente esto:
function myFunction() { const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName('Sheet1'); const vs = sh.getRange(2,1,sh.getLastRow() - 1,5).getValues(); vs.forEach((r,i) => { let td = new Date(r[4]); let tdv = td.valueOf(); let ad = new Date(r[3]); let m = r[2]; let n = 1; do{ var fd = new Date(ad.getFullYear(),ad.getMonth() + (n++ * m), ad.getDate()); var fdv = fd.valueOf(); }while(fdv<tdv); sh.getRange(i + 2,6).setValue(fd).setNumberFormat("dd/MM/yyyy"); }); }