如何在 Apps Script/Google 表格中的一列中的最后一个单元格开始自动填充到相邻列的最后一行?
How to start autofill at last cell in one column to last row of adjacent column in Apps Script/Google Sheets?
所以我有一个 table 将包含除 B 列以外的最后一行的数据。(例如,列 A、C、D 等停在第 40 行,但 B 可能停在第 25 行).我想以编程方式让系列从 B 中数据的最后一个单元格开始,并自动填充到电子表格的最后一行。 (希望执行此操作的脚本能够识别该系列,而不仅仅是将相同的数据复制到所有空单元格。当我手动执行时,它会起作用。)我在这里开始了一些事情,但我不知道如何调出范围从哪里开始这个系列。我在第 7 行收到错误“异常:未找到范围”。
function fillDownFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var sc = ss.getRange("B1:B").getValues();
var scr = sc.filter(String).length;
var lr = ss.getLastRow();
var fillDownRange = ss.getRange(scr,2,lr)
ss.getRange(scr).copyTo(fillDownRange);
}
这是您可以复制最后一个填充值的一种方法。该函数获取所有值,映射需要向下填充的行,然后将最后一个值复制到 sheet.
的其余部分
function fillDownFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var tab = ss.getActiveSheet();
var sc = tab.getDataRange().getValues();
var lastRow = sc.length;
var values = sc.map(function(r) { return r[1]; }).filter(i => i);
var lastFillRow = values.length;
var fillDownValue = values.slice(-1);
tab.getRange(lastFillRow + 1, 2, lastRow - lastFillRow).setValue([fillDownValue]);
}
除了已经提供的答案之外,Apps 脚本已经有一个 autoFill()
方法可以用来执行此操作。有了这个,您只需定义一个源和一个目标范围。这与选择范围并在角上手动向下拖动鼠标的效果相同。
function fillDownFunction() {
var ss= SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var lastsheetrow = ss.getLastRow() //last row with data
//last row in the autofill range with data
var lastrangerow = ss.getRange("B1:B").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()
var sourcerange = ss.getRange(2, 2,lastrangerow-1) //in your screenshot, this would be B2:B6
var destinationrange = ss.getRange(2, 2, lastsheetrow-1) //This would be B2:B12
sourcerange.autoFill(destinationrange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES)
}
请注意,我跳过了 header 行并将范围长度偏移 -1 以进行补偿。这是因为自动填充逻辑使用了整个范围,因此它还会考虑“Item2”并每 6 行重复一次,如“Item3”、“Item4”等。在这种情况下是一个缺点,但如果您计划在未来以更复杂的方式使用自动填充,可能会很有用。
所以我有一个 table 将包含除 B 列以外的最后一行的数据。(例如,列 A、C、D 等停在第 40 行,但 B 可能停在第 25 行).我想以编程方式让系列从 B 中数据的最后一个单元格开始,并自动填充到电子表格的最后一行。 (希望执行此操作的脚本能够识别该系列,而不仅仅是将相同的数据复制到所有空单元格。当我手动执行时,它会起作用。)我在这里开始了一些事情,但我不知道如何调出范围从哪里开始这个系列。我在第 7 行收到错误“异常:未找到范围”。
function fillDownFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var sc = ss.getRange("B1:B").getValues();
var scr = sc.filter(String).length;
var lr = ss.getLastRow();
var fillDownRange = ss.getRange(scr,2,lr)
ss.getRange(scr).copyTo(fillDownRange);
}
这是您可以复制最后一个填充值的一种方法。该函数获取所有值,映射需要向下填充的行,然后将最后一个值复制到 sheet.
的其余部分function fillDownFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var tab = ss.getActiveSheet();
var sc = tab.getDataRange().getValues();
var lastRow = sc.length;
var values = sc.map(function(r) { return r[1]; }).filter(i => i);
var lastFillRow = values.length;
var fillDownValue = values.slice(-1);
tab.getRange(lastFillRow + 1, 2, lastRow - lastFillRow).setValue([fillDownValue]);
}
除了已经提供的答案之外,Apps 脚本已经有一个 autoFill()
方法可以用来执行此操作。有了这个,您只需定义一个源和一个目标范围。这与选择范围并在角上手动向下拖动鼠标的效果相同。
function fillDownFunction() {
var ss= SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var lastsheetrow = ss.getLastRow() //last row with data
//last row in the autofill range with data
var lastrangerow = ss.getRange("B1:B").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()
var sourcerange = ss.getRange(2, 2,lastrangerow-1) //in your screenshot, this would be B2:B6
var destinationrange = ss.getRange(2, 2, lastsheetrow-1) //This would be B2:B12
sourcerange.autoFill(destinationrange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES)
}
请注意,我跳过了 header 行并将范围长度偏移 -1 以进行补偿。这是因为自动填充逻辑使用了整个范围,因此它还会考虑“Item2”并每 6 行重复一次,如“Item3”、“Item4”等。在这种情况下是一个缺点,但如果您计划在未来以更复杂的方式使用自动填充,可能会很有用。