@delongeroman

Как обойти ограничение выполнения скрипта в 6 минут?

Вот кусок кода.
do{ 
      var fio = sheet.getRange(7+i, 8).getValue()
      var data = sheet.getRange(7+i, 1).getValue()
      var vremya = sheet.getRange(7+i, 2).getValue()
      var zakazchik = sheet.getRange(7+i, 3).getValue()
      var adres = sheet.getRange(7+i, 5).getValue()
      var dom = sheet.getRange(7+i, 6).getValue()
      var avto = sheet.getRange(7+i, 7).getValue()
      var prinyal = sheet.getRange(7+i, 11).getValue()
      var formaop = sheet.getRange(7+i, 12).getValue()
      var sdal = sheet.getRange(7+i, 13).getValue()
      var status = sheet.getRange(7+i, 14).getValue()   
      if(status == [['Выполнен']] && formaop != [['Ждем']]){
      zp.getRange(2+j, 1).setValue(fio)
      zp.getRange(2+j, 2).setValue(data)
      zp.getRange(2+j, 3).setValue(vremya)
      zp.getRange(2+j, 4).setValue(zakazchik)
      zp.getRange(2+j, 5).setValue(adres)
      zp.getRange(2+j, 6).setValue(dom)
      zp.getRange(2+j, 7).setValue(avto)    
      zp.getRange(2+j, 8).setValue(formaop)   
      zp.getRange(2+j, 9).setValue(prinyal)  
      zp.getRange(2+j, 10).setValue(sdal)  
      j++
      } 
      i++
  }
  while(data != "")

Код повторяется 30 раз для разных страниц, в итоге, когда скрипт прошёл 13 страниц я столкнулся с тем, что скрипт не успевает обработать за 6 минут все страницы и завершается раньше, чем закончится информация, которую нужно перенести со всех других листов на 1 общий лист. Есть какие-то идеи как это обойти?
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
stomaks
@stomaks
Разработчик Google Apps Script (stomaks.me)
Оптимизировать код!

На каждом обращении к таблице вы теряете много времени getRange, getValue , setValue ...
Лучше всего один раз получить все данные обработать и один раз положить обратно в таблицу, если это позволяют данные конечно же.

Если коротко:
Старайтесь минимизировать количество обращений к таблице/листам.

___
stomaks.me
g-apps-script.com
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ProgrammerForever
@ProgrammerForever Куратор тега Google Sheets
Учитель, автоэлектрик, программист, музыкант
Ух, это слишком жирно.
Данные нужно получать за раз, с помощью range.getValues()
Получается в итоге двумерный массив с доступом data[строка][столбец] (нумерация с 0)
Добавить строки
let maxRows = sheet.getMaxRows();
  let maxColumns = sheet.getMaxColumns();
  let data = sheet.getRange(1, 1, maxRows, maxColumns).getValues();

Потом можно начать с того, чтобы заменить в Notepad++
sheet\.getRange\(\s*(.*?)\s*,\s*(.*?)\s*\)\.getValue\(\)

на
inData[$1][$2]
И аналогично сделать с выводом, чтобы данные выводились в таблицу тоже за раз, с помощью range.setValues()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы