在多工作表流程结束时,我最终得到一个名为 Query 的工作表,其中包含 A1 中的一个查询和该查询的结果,其长度(行)因一种用法而异。最终用户必须能够手动编辑这些结果,但不应允许更改查询,因此查询表受到保护。我编写了一个宏来将数据从这张表复制到另一个名为 Output 的表中,它不受保护,因此用户可以根据需要对其进行编辑。
该宏执行两个功能。首先,它将数据从查询表复制到输出表,只粘贴值。此功能有效。其次,它会从数据下方删除多余的空白行,只留下一个空白行来向用户发出数据已完成的信号。这适用于查询表中的数据比前一次传递过程中的数据更短(即行数更少)的情况,但如果查询表的大小自传递以来增加,则会失败。
分析表明:
- 如有必要,copyTo() 将增加目标工作表中的行数以容纳传入的数据
- 发生这种情况时,getMaxRows() 返回的值不会更新。结果,应删除尾随空白行的代码计算应删除的行数为负数,从而引发错误。
代码,包括几个日志条目:
function Laststep() {
var spreadsheet = SpreadsheetApp.getActive(); // Get this spreadsheet.
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Query'), true);
var sheet = spreadsheet.getActiveSheet(); // Look at the Query sheet.
sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).activate(); // Set the range to all the rows containing data.
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Output'));
var outsheet = spreadsheet.getActiveSheet();
outsheet.getRange(1,1).activate(); // Point to A1 on the Output sheet.
var maxRows = outsheet.getMaxRows(); // Total rows in the sheet, before copyTo().
Logger.log('maxRows before copy = ' + maxRows);
spreadsheet.getRange('Query!A:F').copyTo(outsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
// Copy values-only from Query to Output.
// Delete trailing blank rows from Output:
var lastRow = outsheet.getLastRow()+1; // First empty row. Let the user see it.
Logger.log('lastRow = ' + lastRow);
var maxRows = outsheet.getMaxRows(); // Total rows in the sheet after copyTo().
Logger.log('maxRows after copy= ' + maxRows);
Logger.log('maxRows-lastRow = ' + (maxRows-lastRow));
if (maxRows-lastRow != 0) // If data doesn't fill sheet
{
Logger.log('Deleting...');
outsheet.deleteRows(lastRow, (maxRows-lastRow)); // Delete the excess rows.
}
Logger.log('Done.');
};
错误案例的记录器输出示例:
maxRows before copy = 20
lastRow = 911
maxRows after copy= 20
maxRows-lastRow = -891
Deleting...
Exception: Those rows are out of bounds.
at Laststep(macros:23:14)
问题1:执行copyTo()后,如何才能得到MaxRows的准确计数?
问题 2:在 copyTo() 之后无法更新 MaxRows 是 Apps Script 错误还是我还不明白的问题?