1

在多工作表流程结束时,我最终得到一个名为 Query 的工作表,其中包含 A1 中的一个查询和该查询的结果,其长度(行)因一种用法而异。最终用户必须能够手动编辑这些结果,但不应允许更改查询,因此查询表受到保护。我编写了一个宏来将数据从这张表复制到另一个名为 Output 的表中,它不受保护,因此用户可以根据需要对其进行编辑。
该宏执行两个功能。首先,它将数据从查询表复制到输出表,只粘贴值。此功能有效。其次,它会从数据下方删除多余的空白行,只留下一个空白行来向用户发出数据已完成的信号。这适用于查询表中的数据比前一次传递过程中的数据更短(即行数更少)的情况,但如果查询表的大小自传递以来增加,则会失败。
分析表明:

  1. 如有必要,copyTo() 将增加目标工作表中的行数以容纳传入的数据
  2. 发生这种情况时,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 错误还是我还不明白的问题?

4

0 回答 0