触发条件:错误范围的起始行太小

时间:2019-06-21 03:16:48

标签: google-apps-script google-sheets

每当我尝试使用定时触发器时,我的触发器日志都会显示上述错误。我知道这些功能可以工作,因为它们可以直接从脚本编辑器运行。我知道服务器上运行的功能(触发触发器)与控制台不同,作用域和环境也不同,我已经尝试将其包含在脚本中-但显然失败了。任何人都可以向我指出正确的方向。

过程 脚本应该每10秒选择10 x 3的范围,复制/粘贴值,然后将范围底部的公式复制到接下来的10行。然后,它重置一拍定时器。它将执行此操作,直到达到最大行数或循环运行了n次为止。显然,这是最小化的测试用例。实际的实时数据集需要使用复杂得多的查询公式遍历大量工作表的200,000多行。

在真实数据集上运行公式后,运行36小时后会生成“ Aw snap!”。该脚本应该将该公式方法分解为小块。运行时间不是问题,只是结果的完整性。

我正试图避免将查询公式重写为脚本,但是如果你们说那是唯一的方法。该脚本的触发版本是GAS触发应用上的宝贵学习曲线,因此并没有浪费时间-但这最后一点耗尽了我所有的变通尝试。

测试表的链接为here

请复制工作表的副本,因为需要授权每个实例。请在脚本中替换SPREADSHEET_ID。

[按要求进行编辑,19/06/21]这是执行日志错误的屏幕截图。

[19-06-21 02:59:17:590 PDT] Starting execution
[19-06-21 02:59:17:600 PDT] PropertiesService.getScriptProperties() [0 seconds]
[19-06-21 02:59:17:606 PDT] Properties.getProperty([TIMECOUNT]) [0.005 seconds]
[19-06-21 02:59:17:718 PDT] SpreadsheetApp.openById([xxxxxxxxxxxxxxxxxxxxxxxxxxx]) [0.109 seconds]
[19-06-21 02:59:17:719 PDT] Spreadsheet.getSheetByName([ORG Data]) [0 seconds]
[19-06-21 02:59:17:720 PDT] Sheet.getCurrentCell() [0 seconds]
[19-06-21 02:59:17:720 PDT] Range.getRow() [0 seconds]
[19-06-21 02:59:17:721 PDT] Sheet.getCurrentCell() [0 seconds]
[19-06-21 02:59:17:721 PDT] Range.offset([-10, 0, 10, 3]) [0 seconds]
[19-06-21 02:59:17:729 PDT] Execution failed: The starting row of the range is too small. (line 51, file "Code") [0.124 seconds total runtime]

Here is a screen grab of the Execution Log error

function onOpen() {             
  SpreadsheetApp.getUi()                
    .createMenu('My Tools')
    .addItem('Start Time Trigger', 'TriggerBlocks')
    .addItem('Stop Time Trigger', 'stopTrigger')
    .addToUi(); 
  PropertiesService.getScriptProperties().setProperties({'TIMECOUNT': '0', });
}

  var MAX_TCOUNT = 3;

function TriggerBlocks(){
  ScriptApp.newTrigger("pasteThenCopy")
    .timeBased()
    .after(10*1000)    // 10 seconds
    .create(); 
}

function pasteThenCopy(){
  var timecount = PropertiesService.getScriptProperties().getProperty('TIMECOUNT');
  var ss = SpreadsheetApp.openById(SPREADSHEET_ID);
  var sheet = ss.getSheetByName(SHEET_NAME);
  var ssrow = sheet.getCurrentCell().getRow();
  timecount++;     // coerces string to number
  if( ssrow < 25 && timecount < MAX_TCOUNT) {
    PasteCalcs1000rows(sheet,CopyFormula1000rows);
    PropertiesService.getScriptProperties().setProperty('TIMECOUNT',timecount);
    TriggerBlocks();
    }
};

function PasteCalcs1000rows(sheet,callback) {
  if(sheet == undefined){sheet=SpreadsheetApp.getActiveSheet();};
    sheet.getCurrentCell().offset(-10, 0, 10, 3).activate();
    sheet.getActiveRange().copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
    sheet.getCurrentCell().offset(10, 0).activate();
  callback(sheet);
};

function CopyFormula1000rows(sheet) {
  if(sheet == undefined){sheet=SpreadsheetApp.getActiveSheet();};
  sheet.getCurrentCell().offset(0, 0, 11, 1).activate();
  sheet.getCurrentCell().copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  sheet.getCurrentCell().offset(10, 0).activate();
}

1 个答案:

答案 0 :(得分:1)

出于评论目的发布评论的答案

手动更改工作表,然后打开代码不会从您的手动操作中抓取currentCell。您需要在开始时将H12单元格设置为活动状态,然后它将按预期运行。您的代码现在将活动单元格设置为A1(当它抓住工作表时),这就是为什么它以ross和Tedinoz建议的方式工作的原因。

TLDR;在调用偏移量

之前尝试sheet.getRange("H12".activate());