每当我尝试使用定时触发器时,我的触发器日志都会显示上述错误。我知道这些功能可以工作,因为它们可以直接从脚本编辑器运行。我知道服务器上运行的功能(触发触发器)与控制台不同,作用域和环境也不同,我已经尝试将其包含在脚本中-但显然失败了。任何人都可以向我指出正确的方向。
过程 脚本应该每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]
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();
}
答案 0 :(得分:1)
出于评论目的发布评论的答案
手动更改工作表,然后打开代码不会从您的手动操作中抓取currentCell
。您需要在开始时将H12单元格设置为活动状态,然后它将按预期运行。您的代码现在将活动单元格设置为A1(当它抓住工作表时),这就是为什么它以ross和Tedinoz建议的方式工作的原因。
TLDR;在调用偏移量
之前尝试sheet.getRange("H12".activate());