Мой журнал триггеров показывает вышеуказанную ошибку всякий раз, когда я пытаюсь использовать синхронизированный триггер.Я знаю, что эти функции работают, так как они могут быть запущены непосредственно из редактора скриптов.Я знаю, что область действия и среда различны для функций, которые запускаются на сервере (а-ля триггер), в отличие от консоли, и я пытался учесть это в сценарии, но явно потерпел неудачу.Может кто-нибудь направить меня в правильном направлении, пожалуйста.
Процесс Каждые 10 секунд предполагается, что сценарий выбирает диапазон 10 на 3, копирует / вставляет ЗНАЧЕНИЯ на место, а затем копирует формулув нижнем ряду диапазона вниз через следующие 10 строк.Затем он сбрасывает таймер одного выстрела.Это будет выполняться до тех пор, пока не будет достигнуто максимальное количество строк или цикл не будет выполнен n раз.Это явно минимизированный контрольный пример.Фактический живой набор данных должен пройти более 200 000 строк по нескольким листам с помощью значительно более сложной формулы запроса.
Запуск формулы для реального набора данных приводит к созданию «Aw snap!»после 36 часов работы.Этот скрипт должен разбить этот метод формулы на куски размером с кусочек.Время выполнения не проблема, просто целостность результата.
Я пытаюсь избежать необходимости переписывать формулу запроса в виде сценария, но если вы, ребята, скажете, что это единственный способ, то так и будет,Эта триггерная версия скрипта была ценной кривой обучения в приложении триггера GAS, так что это не потерянное время - но этот последний бит исчерпал все мои попытки обходного пути.
Ссылка на тестовый лист здесь
Пожалуйста, сделайте копию листа, так как каждый экземпляр должен быть авторизован.Пожалуйста, замените SPREADSHEET_ID в скрипте.
[Редактировать по запросу 21/06/19] Вот скриншот ошибки журнала выполнения.
[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();
}