Добавление нескольких контактов превышает время - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь вставить / обновить несколько контактов (1000+) в Google следующим образом:

(в цикле:)

      if (contact == null) {
        contact = ContactsApp.createContact(first_name, last_name, email);
        group.addContact(contact);
      } else {
        contact.setFullName(first_name+' '+last_name);
        contact.setGivenName(first_name);
        contact.setFamilyName(last_name);
      }

Работает нормально, но примерно через 1 минута (добавлено 100-130 контактов) сценарий останавливается с:

Ошибка Превышено максимальное время выполнения

Есть ли способ обойти это?

1 Ответ

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

Проблема:

Сценарий приложений имеет ограничение по времени выполнения , равное 6 или 30 минутам, в зависимости от вашей учетной записи. Скорее всего, вы достигли этого предела.

Обходной путь:

Чтобы избежать этого, вы можете разделить действия, которые вы хотите выполнить, на разные исполнения, установив временной триггер, который будет запускать каждый последующий выполнение после того, как предыдущий закончен. Я полагаю, что ваша функция имеет значение al oop, поэтому вы можете выполнить следующие шаги:

  • Узнать, сколько итераций может пройти сценарий go до достижения ограничения по времени (вероятно, 6 минут). Каждое выполнение должно будет выполнить go через это количество итераций перед остановкой.
  • Создайте следующий основанный на времени триггер в конце вашей функции: after (durationMilliseconds) . Благодаря этому вы можете запускать любую функцию, указанную вами, по истечении указанного вами количества миллисекунд. После каждого выполнения будет создан триггер для запуска следующего.
  • Сделайте свой l oop a for l oop. Поскольку вам нужно разделить l oop, вы должны где-то хранить счетчик l oop (назовем его i) (вы можете использовать PropertiesService в конце каждого выполнения или записать в электронной таблице) и извлекают его в начале следующего, чтобы каждый сценарий, находящийся в последовательном выполнении, знал, где возобновить l oop. См., Например, этот ответ , если вы не знаете, как хранить и извлекать свойства скрипта.

Пример кода (проверьте встроенные комментарии):

function createContacts() {
  // Whatever your code outside the loop is
  var i_old = // Retrieve i stored in previous execution (from PropertiesService? Spreadsheet?) (should be 0 if first execution)
  var n_int = 100 // Number of iterations that can be done in a single execution without reaching time limit (change accordingly)
  var total = 1000 || yourVariable.length // Total number of iterations (change accordingly)
  // Loop starts at previous i store until it reaches the specified number of iterations for one execution or reaches the total number:
  for(var i = i_old; i <= i_old + n_int && i <= total; i++) {
    // Whatever your code inside the loop is
  }
  // Store i somewhere (PropertiesService? Spreadsheet?)
  if (i <= total) { // Create trigger if i hasn't reach the total number of iteration
    ScriptApp.newTrigger("createContacts")
    .timeBased()
    .after(1000 * 60) // This fires the function 1 minute after the current execution ends. Change this time according to your preferences
    .create();  
  }
}

Примечание:

Ссылка:

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