Служба календаря скриптов Google Apps: как избежать превышения максимального времени выполнения? - PullRequest
0 голосов
/ 24 марта 2020

Мне нужно отредактировать несколько сотен или даже несколько тысяч событий календаря с помощью скрипта Google Apps. Речь идет о незначительных изменениях в названии (event.setTitle()) и описании (event.setDescription()), ничего особенного. При попытке примерно с 600 событиями максимальное время выполнения 360 секунд уже превышено.

var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
for (var i = 0; i < events.length; i++) {
  events[i].setTitle(events[i].getTitle() + " something");
  events[i].setDescription(events[i].getDescription() + " something else");
}

Как обработать события в нескольких фрагментах подряд?

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Ответ:

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

Код:

Вы можете использовать пару значений ключа PropertiesService, чтобы сохранить значение счетчика через events[]:

function renameEvents() {
  var cal = CalendarApp.getCalendarById("Calendar Id");
  var startTime = new Date(1850, 0, 1);
  var endTime = new Date(2100, 0, 1);
  var events = cal.getEvents(startTime, endTime);
  var sp = PropertiesService.getScriptProperties();
  if (!(sp.getProperty("count")) || sp.getProperty("count") == 0) {
    var count = 0;
  else if ((sp.getProperty("count") > 0) {
    var count = sp.getProperty("count");
  }

  for (var i = count; i < events.length; i++) {
    events[i].setTitle(events[i].getTitle() + " something");
    events[i].setDescription(events[i].getDescription() + " something else");
    sp.setProperty("count", i)
  }
}

Это сделает скрипт немного медленнее, но каждый раз, когда вы его запускаете оно будет продолжаться по календарным событиям с того места, где остановилось последнее.

Надеюсь, это будет полезно для вас!

Ссылки:

1 голос
/ 24 марта 2020

Ранее я использовал что-то похожее на следующее:

В начале каждого l oop проверьте, достаточно ли времени буфера для завершения l oop.

Обновляйте время буфера всякий раз, когда его превышает один l oop.

Используйте PropertiesService для хранения как буфера, так и последнего индекса.

var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
var ps = PropertiesService.getScriptProperties();
var startIndex = ps.getProperty('lastIndex') || 0;
var buffer = ps.getProperty('buffer') || 100;

var startTime = new Date();
var maxTime = 1000*60*6; //6 mins


for (var i = startIndex; i < events.length; i++) {
  var loopStart = new Date()
  if (loopStart - startTime > (maxTime-buffer) ) {
     ps.setProperty('lastIndex', i);
     break;
  }
  events[i].setTitle(events[i].getTitle() + " something");
  events[i].setDescription(events[i].getDescription() + " something else");
  var loopTime = new Date() - loopStart;
  if (loopTime  > buffer ) buffer = loopTime * 1.5
}

ps.setProperty('buffer',buffer) 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...