获取 Google 工作表中某个范围的最后 X non-empty 行
Get the last X non-empty rows of a range in Google Sheets
我的范围如下图所示:
其中顶部 headers 代表一年中的月份 (1-12),左列代表一个月中的天数(1 到 28/29/30/31)。
我想在我的范围的最后 30 天执行 SUM 函数,以便它从最后一个 non-empty 值开始计数并上升直到达到该列的第一个值,然后如果还有天数要计算,则转到上个月并从最后一个值开始计算。
例如,在图像中,如果我想要范围内最后 6 个单元格的值的总和,它将求和 16、12、8、4、4 和 15。
我已尝试根据 here 所述的类似问题调整解决方案,但到目前为止我还没有成功。
使用 this question about iterating over a range using Google Script 的解决方案,我能够设计出一个有效的脚本。
该脚本将从范围的最后一个单元格向后迭代特定数量的单元格(它在移动到前一列之前迭代一列的所有行),跳过空单元格,returns 总和在新单元格中遇到的值。
function sumOfLast30() {
var range = SpreadsheetApp.getActiveSheet().getRange("A1:B2");
var numRows = range.getNumRows(); // 2
var numCols = range.getNumColumns(); // 2
var counter = 0;
var counterMax = 2; // this determines how many cells get counted
var sumValues = 0;
for (var i = numCols; i > 0; i--)
{
if (counter == counterMax) {
break;
}
for (var j = numRows; j > 0; j--) {
var selectedValue = range.getCell(j,i).getValue();
if (selectedValue != "")
{
sumValues = sumValues + selectedValue;
counter++;
if (counter == counterMax)
{
break;
}
}
}
}
var target = SpreadsheetApp.getActiveSheet().getRange("C3");
target.setValue(sumValues);
}
我的范围如下图所示:
其中顶部 headers 代表一年中的月份 (1-12),左列代表一个月中的天数(1 到 28/29/30/31)。
我想在我的范围的最后 30 天执行 SUM 函数,以便它从最后一个 non-empty 值开始计数并上升直到达到该列的第一个值,然后如果还有天数要计算,则转到上个月并从最后一个值开始计算。
例如,在图像中,如果我想要范围内最后 6 个单元格的值的总和,它将求和 16、12、8、4、4 和 15。
我已尝试根据 here 所述的类似问题调整解决方案,但到目前为止我还没有成功。
使用 this question about iterating over a range using Google Script 的解决方案,我能够设计出一个有效的脚本。
该脚本将从范围的最后一个单元格向后迭代特定数量的单元格(它在移动到前一列之前迭代一列的所有行),跳过空单元格,returns 总和在新单元格中遇到的值。
function sumOfLast30() {
var range = SpreadsheetApp.getActiveSheet().getRange("A1:B2");
var numRows = range.getNumRows(); // 2
var numCols = range.getNumColumns(); // 2
var counter = 0;
var counterMax = 2; // this determines how many cells get counted
var sumValues = 0;
for (var i = numCols; i > 0; i--)
{
if (counter == counterMax) {
break;
}
for (var j = numRows; j > 0; j--) {
var selectedValue = range.getCell(j,i).getValue();
if (selectedValue != "")
{
sumValues = sumValues + selectedValue;
counter++;
if (counter == counterMax)
{
break;
}
}
}
}
var target = SpreadsheetApp.getActiveSheet().getRange("C3");
target.setValue(sumValues);
}