2015-12-30 5 views
1

У меня есть функция, которая вычисляет расстояние между двумя координатами следующим образом:Как поместить вызов Utilities.sleep() между вызовами функций?

function distance(origin, destination) { 
    //Utilities.sleep(Math.random() * 60000); 
    destination = destination + ""; 
    if (destination.split(",").length == 2) { 
    var directions = Maps.newDirectionFinder() 
    .setOrigin(origin) 
    .setDestination(destination) 
    .getDirections(); 
    if (directions.routes.length > 0) { 
     return directions.routes[0].legs[0].distance.value/1000; 
    } 
    return "-"; 
    } 
    return 0; 
} 

Он используется в таблице следующим образом:

=distance("83.342353,23.23353", V2) 

Функция работает нормально, но попадает в ограничение скорости для url, так как моя таблица имеет более 200 строк. Сообщение об ошибке:

Служба, вызываемая слишком много раз за короткое время: urlfetch protected host rateMax. Попробуйте выполнить Utilities.sleep (1000) между вызовами. (строка 5)

Исправлено предложение поместить в код код Utitlies.sleep(). Где именно я должен это поставить?

+0

Вы используете это как пользовательскую функцию внутри листов Google? –

+0

Да. Я добавил формулу к вопросу. – topher

ответ

4

Проблема здесь в том, что даже если вы положили Utilities.sleep, функция все еще вызывается несколько раз одновременно. Это то, что делает листы Google обычно. Он выполняет функции параллельно, чтобы ускорить работу. Итак, вам нужно заставить его работать в последовательности, которую вы можете достичь с помощью блокировки. , например.

function distance(origin, destination) { 
    destination = destination + ""; 
    if (destination.split(",").length == 2) { 
    var lock = LockService.getScriptLock(); 
    lock.waitLock(20000); 
    Utilities.sleep(500); 
    var directions = Maps.newDirectionFinder() 
    .setOrigin(origin) 
    .setDestination(destination) 
    .getDirections(); 
    lock.releaseLock(); 
    if (directions.routes.length > 0) { 
     return directions.routes[0].legs[0].distance.value/1000; 
    } 
    return "-"; 
    } 
    return 0; 
} 

Однако квота на услугу пеленгации относительно невелика. Может быть, всего 1000 применений в день. Таким образом, вы все еще можете столкнуться с проблемами.

+0

Спасибо. Я попал в квоту, как вы упомянули, поэтому я выберу метод, отличный от Google. – topher

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