1

В настоящее время я разрабатываю новую таблицу для своей компании, чтобы сделать одну из задач, которые мы делаем на еженедельной основе, более простой - способ ее работы заключается в том, что данные импортируются в эту таблицу, а затем сценарии запускаются для генерации отчетов, которые мы используем. Ниже приведен пример одного из сценариев, которые я сделал для разработки одной части таблицы.Сценарий Google Apps - превысило максимальное время выполнения

Данные, импортируемые вручную в электронную таблицу, могут содержать до 3000 ячеек информации, следовательно, цикл для проверки ячеек - однако всякий раз, когда этот скрипт запускается, он встает до строки 1617, а затем дает мне ошибку, превышающую максимальную время выполнения - все равно для меня избежать этой проблемы, так как у меня есть несколько скриптов, которые нужно запустить после этого, чтобы помочь сгенерировать отчеты, которые мы используем.

Существует 6 листов, каждый лист имеет введенные данные в зависимости от значения ячейки в импортированных данных.

function WorkoutTotals() { 
// ----------------------------------------------------------------------------- 
// This function is used for working out the totals of each centre 
// ----------------------------------------------------------------------------- 
var value; 
for (var j = 2; j < abignumber; j++) { 
    var rawcentres = rawdata.getRange(j, 1); 
    var rawcategory = rawdata.getRange(j, 6); 
    switch (rawcentres.getValue()) { 
    case centres[0]: 
     centresheet = ss.getSheetByName(sheets[0]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[1]: 
     centresheet = ss.getSheetByName(sheets[1]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[2]: 
     centresheet = ss.getSheetByName(sheets[2]); 
     switch (rawcategory.getValue()) { 
     case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[3]: 
     centresheet = ss.getSheetByName(sheets[3]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[4]: 
     centresheet = ss.getSheetByName(sheets[4]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
    case centres[5]: 
     centresheet = ss.getSheetByName(sheets[5]); 
     switch (rawcategory.getValue()) { 
        case "a1": 
      range = centresheet.getRange(cramrow, 1) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "A2": 
      range = centresheet.getRange(cramrow, 2) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a3": 
      range = centresheet.getRange(cramrow, 3) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a4": 
      range = centresheet.getRange(cramrow, 4) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a5": 
      range = centresheet.getRange(cramrow, 5) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a6": 
      range = centresheet.getRange(cramrow, 6) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a7": 
      range = centresheet.getRange(cramrow, 7) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a8": 
      range = centresheet.getRange(cramrow, 8) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a9": 
      range = centresheet.getRange(cramrow, 9) 
      range.setValue(range.getValue() + 1) 
      break; 
     case "a10": 
      range = centresheet.getRange(cramrow, 10) 
      range.setValue(range.getValue() + 1) 
      break; 
     } 
     break; 
     } 
    break; 
    } 
} 
} 

ответ

1

Основная проблема заключается в том, что скрипт получает/устанавливает значение для каждой итерации. Вместо этого вы можете получить весь диапазон, рассчитать, а затем обновить диапазон, чтобы сократить время выполнения. Вот similar example с сайта разработчиков.

+0

Даже тогда для большого количества данных вам может потребоваться перезаписать сценарий, чтобы он обрабатывал куски с помощью триггера времени и сохранял текущее состояние, сохраненное в scriptProperties. –

+0

Есть ли у вас пример, который я мог бы использовать? Я очень редко кодирую JavaScript, поэтому мой плохой код = /. – Andy

+0

@ Крис прав, что пакетное чтение/запись должно решить эту проблему. Существуют также учебные пособия по чтению/письму электронных таблиц как объекты https://developers.google.com/apps-script/guides/sheets. Если chunking сценарий по-прежнему требуется, была опубликована новая пользовательская библиотека скриптов для этого http://patt0.blogspot.in/2014/01/using-scriptapp-to-process-batches-in.html – mhawksey

Смежные вопросы