Проблема скрипта электронной таблицы Google - ошибка: истекло время ожидания обслуживания: скрипт скрипта - PullRequest
0 голосов
/ 10 июня 2011

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

Ошибка: истекло время обслуживания: скрипт приложения

Сам сценарий прост. Он запрашивает соответствующий столбец (имеется несколько событий) и затем проверяет, есть ли какой-либо ответ, заданный пользователем - обычно «ДА», «НЕТ» или пробел.

Что означает эта ошибка, и есть ли у кого-нибудь предложения по исправлению?

function sumRSVP(response, rsvpType) {
  var rsvpCol = 7;
  if (rsvpType == "rehearsal") rsvpCol = 8;  
  if (rsvpType == "brunch") rsvpCol = 9;

  var mySum = 0;

  var sh = SpreadsheetApp.getActiveSheet();
  for( i=2; i<177; i++){

    var rsvp = sh.getRange(i, rsvpCol).getValue();
    var nguests = sh.getRange(i, 6).getValue();
    if(nguests != "" && rsvp == response){
      mySum = mySum + parseFloat(nguests);
    }
  }

  return mySum;
}

1 Ответ

4 голосов
/ 12 мая 2012

Надеюсь, свадьба прошла хорошо.Это было задано некоторое время назад, но было просмотрено более 300 раз в этом сообщении, и я считаю важным:

Данные не должны извлекаться из электронной таблицы в цикле .Необходимые данные следует извлекать в виде пакета в массив, а массив оценивать в цикле.

См. Ссылку на документацию по адресу: https://developers.google.com/apps-script/guide_common_tasks#OptimizeScripts

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

function sumRSVP(response, rsvpType) {
  var rsvpCol = 7;
  if (rsvpType == "rehearsal") rsvpCol = 8;  
  if (rsvpType == "brunch") rsvpCol = 9;

  var mySum = 0;

  var sh = SpreadsheetApp.getActiveSheet();
  // start at row 2 - uses columns 6-9
  var data = sh.getRange(2, 6, 177 - 1 , 4).getValues();
  for(var i=0; i<data.length; i++){

    var rsvp = data[i][rsvpCol - 6];
    var nguests = data[i][0];
    if(nguests != "" && rsvp == response){
      mySum = mySum + parseFloat(nguests);
    }
  }

  return mySum;
}
...