在我的电子表格中,我有一个正在运行的脚本,它使用的是 getLastRow()
函数作为其逻辑的一个重要部分。
自从我在其中一列中应用了数组公式后,我就把 getLastRow()
函数不能正常工作。似乎数组公式一直 "应用 "到工作表的底部,即使其他列中没有其他值,因此。getLastRow()
返回的是有数组公式的最后一行,而不是实际的非空行。
对我来说,写一个缓慢的函数来检查哪些单元格是空的是不可行的,因为这样的脚本运行会耗尽时间(它有几万行)。
有谁有什么建议可以解决?
下面是 ARRAYFORMULA
:
=ArrayFormula(IF(A2:A="",,WEEKNUM(A2:A, 2)))
ARRAYFORMULA()
使用 ARRAYFORMULA
妥帖 INDEX/COUNTA
(确定需要的最后一行)确保公式只填到需要的那一行,而不是伪装。
假设你的数据之间没有空白。
=ARRAYFORMULA(WEEKNUM(A2:INDEX(A2:A,COUNTA(A2:A)),2))
另一个解决方案是暂时删除ArrayFormulas与
sheet.getRange("location of array formula").setValue('');
然后计算lastRow
var lastRow = sheet.getLastRow();
然后替换数组公式
sheet.getRange("location of array formula").setFormula('the formula');
下面是一个函数,你可以用它来确定 "真"。lastRow
和 lastColumn
的值 Sheet
值。它既能处理混乱的 ArrayFormula()
和合并后的细胞。
function getSheetBoundaries2(sheet) {
var dim = { lastColumn: 1, lastRow: 1 };
sheet.getDataRange().getMergedRanges()
.forEach(function (e) {
var lastColumn = e.getLastColumn();
var lastRow = e.getLastRow();
if (lastColumn > dim.lastColumn) dim.lastColumn = lastColumn;
if (lastRow > dim.lastRow) dim.lastRow = lastRow;
});
var rowCount = sheet.getMaxRows();
var columnCount = sheet.getMaxColumns();
var dataRange = sheet.getRange(1, 1, rowCount, columnCount).getValues();
for (var rowIndex = rowCount; rowIndex > 0; rowIndex -= 1) {
var row = dataRange[rowIndex - 1];
if (row.join('').length > 0) {
for (var columnIndex = columnCount; columnIndex > dim.lastColumn; columnIndex -= 1) {
if (("" + row[columnIndex - 1]).length > 0) dim.lastColumn = columnIndex;
}
if (dim.lastRow < rowIndex) dim.lastRow = rowIndex;
}
}
return dim;
}