[英]Fill Down Formula while ignoring empty cells- Google Scripts
我正在尝试编写一个脚本来替换以下公式:
=ARRAYFORMULA(IF((BM3:BM <> "") * (BN3:BN <> ""), BM3:BM + BN3:BN,))
到目前为止,这是我所在的位置:
function Formula_Columns() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
ss.getRange("BP3").setFormula("=BM3 + BN3");
var lr = ss.getLastRow();
var fillDownRange = ss.getRange(3,68,lr-2);
ss.getRange("BP3").copyTo(fillDownRange);
}
我想要发生的是,当日期输入 BM 列时,公式会将 BM 列中的日期与 BN 列中设置的时间组合起来,并将其放入 BP 列。 仅当 BM 中的单元格中有日期时,我才需要脚本将 function 添加到 BP 中。 正如现在编写的脚本,如果 BM 和 BN 列中没有分别输入日期和时间,它会输入 12/30/1899 0:00:00。 (见下面的截图)
我将不胜感激。 先感谢您。
我看到了三种解决方法。 请参阅以下方法:
// Copying just the displayed values and returning the combined values
function writeValuesOnly() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
var dates = ss.getRange(3, 65, lr - 2, 2).getDisplayValues();
dates = dates.map(row => {
// if BM and BN is present
if(row[0] && row[1])
return [row[0] + ' ' + row[1]];
// else, return blank
else
return [''];
});
ss.getRange(3, 68, dates.length, dates[0].length).setValues(dates);
// make sure to format the whole column to date time
ss.getRange(3, 68, lr - 2, 1).setNumberFormat("MM/dd/yyyy HH:mm:ss")
}
// Writing the ARRAYFORMULA on BP3
// Then set the formatting of the column to Date Time
function writeArrayFormula() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
ss.getRange(3, 68).setFormula(`=ARRAYFORMULA(IF((BM3:BM <> "") * (BN3:BN <> ""), BM3:BM + BN3:BN,))`);
// make sure to format the whole column to date time
ss.getRange(3, 68, lr - 2, 1).setNumberFormat("MM/dd/yyyy HH:mm:ss")
}
// Copying formula to all cells in the column until last row of column BM
function writeFormulaPerCell() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
var colValues = ss.getRange("BM3:BM" + lr).getValues();
var colLastRow = lr - colValues.reverse().findIndex(cell => cell[0] != '');
// if BM and BN is present, populate
ss.getRange(3, 68, colLastRow - 2, 1).setFormulaR1C1(`=IF(AND(R[0]C[-3] <> "", R[0]C[-2] <> ""), R[0]C[-3] + R[0]C[-2], "")`);
// make sure to format the whole column to date time
ss.getRange(3, 68, lr - 2, 1).setNumberFormat("MM/dd/yyyy HH:mm:ss")
}
writeValuesOnly
不会在更新BM
和BN
时自动更新值。writeFormulaPerCell
,你需要使用setFormulaR1C1
而不是因为当它被复制到其他行/列时,公式会根据范围自动调整。setNumberFormat
(或不格式化范围输出)可能会产生意外结果,例如改为显示 float 数据类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.