如何循环将月份添加到每个日期直到满足条件? google 应用脚本
How do I loop adding the month to each date until the condition is met? google apps script
如何循环将月份添加到每个日期直到满足条件?
说明:我想每次都给每个日期加上 3 个月,直到年度列(D 列)大于今天的日期(E 列)。
示例: 如果我们使用年度“01/02/2021”列的第一行,然后在前 3 个月添加,结果将为 01/05/2021然后我们添加第二次 3 个月 01/08/2021 ..等,直到它是 01/05/2022(大于今天的日期)。
在“H”栏中我写了我想要的结果,但我得到的是在“F”栏中的红色。
这是我的代码:
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)
}
}
这是我的数据屏幕:
enter image description here
感谢您提供的示例和图片很有帮助:
我将提出一个快速修复的建议,看看它是否有效。看起来您可能会在 f 列中以毫秒为单位发布日期值。所以试试这个:
ss.getRange(i, 6).setValue(new Date(Date_2021_constructed)).setNumberFormat("dd/MM/yyyy");
如果这不起作用,我会仔细查看,从您的电子表格中获得 table 个值会很有帮助,以便我进行测试。
如果上述解决方案不起作用,请尝试以下方法:
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");
});
}
如何循环将月份添加到每个日期直到满足条件?
说明:我想每次都给每个日期加上 3 个月,直到年度列(D 列)大于今天的日期(E 列)。
示例: 如果我们使用年度“01/02/2021”列的第一行,然后在前 3 个月添加,结果将为 01/05/2021然后我们添加第二次 3 个月 01/08/2021 ..等,直到它是 01/05/2022(大于今天的日期)。
在“H”栏中我写了我想要的结果,但我得到的是在“F”栏中的红色。
这是我的代码:
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)
}
}
这是我的数据屏幕:
enter image description here
感谢您提供的示例和图片很有帮助:
我将提出一个快速修复的建议,看看它是否有效。看起来您可能会在 f 列中以毫秒为单位发布日期值。所以试试这个:
ss.getRange(i, 6).setValue(new Date(Date_2021_constructed)).setNumberFormat("dd/MM/yyyy");
如果这不起作用,我会仔细查看,从您的电子表格中获得 table 个值会很有帮助,以便我进行测试。
如果上述解决方案不起作用,请尝试以下方法:
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");
});
}