当前位置: 首页 > 知识库问答 >
问题:

在Google sheet archiving宏中获取工作表的最后一行时出错

潘胤
2023-03-14

我有一个在Google工作表后台运行的宏脚本,当“公式”选项卡中的行数超过10行时,它会将包含公式的选项卡存档(复制和粘贴值)到不包含公式的新存档选项卡。这使得工作表不会随着所有内置公式的行数增加而减慢。

宏几天前坏了,什么都没变,除了我在脚本编辑器中看到的这个新错误。

下面是返回我们正在存档的工作表的最后一行(带公式)的代码。错误信息告诉我这部分代码坏了。

var Direction=SpreadsheetApp.Direction;
var DailySLast =dailySheet.getRange("A"+(dailySheet.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();

下面是指向的错误消息。getNextDataCell部分

Exception: Invalid argument
myFunction  @ Code.gs:8

知道为什么会这样吗?

下面是整个功能

function myFunction() {
   // Get handles to Daily and Archive sheets
  var dailySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scorecard');
  var appendSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('[Archive] Scorecard');

  //get last row of the daily sheet
  var Direction=SpreadsheetApp.Direction;
  var DailySLast =dailySheet.getRange("A"+(dailySheet.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();

  //Range of cells to be copied
  var CopyRange = "Scorecard!9:" + DailySLast;

  //Range of cells to be deleted
  var DelRange = "Scorecard!9:" + 2000;

  //get last row of the archive sheet
  var ArchiveSLast =appendSheet.getRange("A"+(appendSheet.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();

  //copying destination range
  var destrange1 = "[Archive] Scorecard!" + (ArchiveSLast + 1) + ":" + (ArchiveSLast + DailySLast-8);
  var destrange=  dailySheet.getRange(destrange1);

  // Clear the contents only if Underwriting sheet has more than 10 rows of data

  if(DailySLast>10) {

  //copying the data
  var sourceDataValues = dailySheet.getRange(CopyRange).copyTo(destrange,SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  // Get the formulas from the sheet
  var formulas =  dailySheet.getRange(DelRange).getFormulas();

  // Delete the data from the daily sheet
  dailySheet.getRange(DelRange).clearContent();

  //Put the formulas back in the sheet
  dailySheet.getRange(DelRange).setFormulas(formulas)};

  //Browser.msgBox(DailySLast, Browser.Buttons.OK_CANCEL);
}

共有1个答案

齐望
2023-03-14
function testquestion() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  const rg = sh.getRange(sh.getLastRow()+1,1);
  let r = rg.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(r),'Test');
}

如果电子表格底部没有可用的行,我会得到相同的结果

Execution log
3:44:46 PM  Notice  Execution started
3:44:46 PM  Error   
Exception: Invalid argument
testquestion    @ ag1.gs:5

在本例中,getLastRow()1不存在,因为没有更多的行。

这样的事情可能会为您解决问题:

function testquestion() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  //add this section to prevent error
  let lr=sh.getLastRow();
  let mr=sh.getMaxRows();
  if(lr==mr) {
    sh.insertRowAfter(mr);
  }
  //end of section
  const rg = sh.getRange(sh.getLastRow()+1,1);
  let r = rg.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(r),'Test');
}

更新:

 function myFunction() {
      // Get handles to Daily and Archive sheets
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scorecard');
      var appendSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('[Archive] Scorecard');
      //add this section to prevent error
      let lr = sh.getLastRow();
      let mr = sh.getMaxRows();
      if (lr == mr) {
        sh.insertRowAfter(mr);
      }
      //end of section
      //get last row of the daily sheet
      var Direction = SpreadsheetApp.Direction;
      var DailySLast = sh.getRange("A" + (sh.getLastRow() + 1)).getNextDataCell(Direction.UP).getRow();
    
      //Range of cells to be copied
      var CopyRange = "Scorecard!9:" + DailySLast;
    
      //Range of cells to be deleted
      var DelRange = "Scorecard!9:" + 2000;
    
      //get last row of the archive sheet
      var ArchiveSLast = appendSheet.getRange("A" + (appendSheet.getLastRow() + 1)).getNextDataCell(Direction.UP).getRow();
    
      //copying destination range
      var destrange1 = "[Archive] Scorecard!" + (ArchiveSLast + 1) + ":" + (ArchiveSLast + DailySLast - 8);
      var destrange = sh.getRange(destrange1);
    
      // Clear the contents only if Underwriting sheet has more than 10 rows of data
    
      if (DailySLast > 10) {
    
        //copying the data
        var sourceDataValues = sh.getRange(CopyRange).copyTo(destrange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
    
        // Get the formulas from the sheet
        var formulas = sh.getRange(DelRange).getFormulas();
    
        // Delete the data from the daily sheet
        sh.getRange(DelRange).clearContent();
    
        //Put the formulas back in the sheet
        sh.getRange(DelRange).setFormulas(formulas)
      };
 类似资料:
  • 问题内容: 我需要列表的最后9个数字,而且我敢肯定有一种切片方法,但是我似乎无法理解。我可以这样获得前9个: 问题答案: 您可以在切片运算符中使用负整数。这是使用python CLI解释器的示例: 重要的是

  • 问题内容: 什么是最好,最简单的方法?我的查询当前是: 但是,这显示前10行,而不显示最后10行。 编辑:我想要最后10行(这是,DESC做到这一点)但是,我希望它们以升序返回。 问题答案: 颠倒顺序(因此获得最后10个而不是前10个),请使用代替 编辑 根据您的评论:

  • 我正试图按照google官方文档,在Python3中读取和写入不同表单的值。尽管我能够使用在下面提到的代码块中: 我试图从这里使用示例代码编写值: 我面临的问题是,我无法从官方文档中保留最新的表名或id,因为最新的api修订版正在随机生成gid(我们可能不知道表gid是什么)。是否有任何方法可以使用google sheet api v4引用工作表列表或电子表格最新修订的工作表名称或id?

  • 问题内容: 我有一个包含800,000个没有主键的条目的表。我不允许添加主键,我无法按 TOP 1 .... ORDER BY DESC进行 排序, 因为完成此任务需要几个小时 。因此,我尝试了以下方法: 当然,这是行不通的。 无论如何要使用此代码或更好的代码来检索表中的最后一行? 问题答案: 我假设当您说“最后一行”时,您的意思是“最后创建的行”。 即使您具有主键,使用它来确定行的创建顺序仍然不

  • 问题内容: 我有一个3D张量形状,其中第二维(即时间步长)未知。我使用以下代码段来处理此类输入: 实际上,以一些实际数字运行此代码后,我得到了一些合理的结果: 输出为: 有没有一种方法可以通过动态RNN的 最后一个相关输出 获得形状的3-D张量?谢谢! 问题答案: 这就是collect_nd的目的! 在您的情况下: 现在是维的张量。

  • 问题内容: 我正在使用多视图索引来插入新闻详细信息。在第一个视图中,用户可以输入新闻的详细信息,然后单击下一步按钮将其插入db。第二个视图中,用户可以添加新闻的图像(仅允许3张图像), 我遇到的问题是,第一个视图将数据插入具有主键newsID的表dbo.newsdetail中,而第二个视图应使用刚刚添加到newsimages表中的新闻的newsId添加受尊重的图像。我只是不知道如何获取在第一个视图