Как я могу обойти вызванную ошибку слишком много раз? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь использовать следующий скрипт для заполнения почтовых индексов для более чем 3000 ячеек:

function geo2zip(a) {
  var response=Maps.newGeocoder()
 .reverseGeocode(lat(a),long(a));
 return response.results[0].formatted_address.split(',') 
  [2].trim().split(' ')[1];
   }
 function lat(pointa) {
 var response = Maps.newGeocoder()
 .geocode(pointa);
  return response.results[0].geometry.location.lat
  }
  function long(pointa) {
  var response = Maps.newGeocoder()
 .geocode(pointa);
  return response.results[0].geometry.location.lng
   }

Очевидно, что примерно через 5 я получаю сообщение об ошибке, что служба вызывается слишком много раз

Проще говоря, как я могу заплатить (или добавить в код), чтобы иметь возможность запускать скрипт для нужных мне клеток?

1 Ответ

0 голосов
/ 26 апреля 2019

Я не уверен насчет задержки. Возможно, вам придется поиграть с этим. И я также не уверен, что вам разрешат сделать 3000 операций за один день. Но не обращая внимания на квоты на данный момент, , которые я бы не рекомендовал , вы могли бы сделать что-то вроде этого.

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

function loopGeocode(start) {
  var start=start || 0;
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Points');
  var sh2=ss.getSheetByName('Locations');
  var pt=sh1.getRange(1, 1,sh.getLastRow(),1).getValues();
  for(var i=start;i<pt.length;i++) {
    sh2.appendRow([i+1,pt[i][0],geo2zip(pt[i][0])])
    Utilities.sleep(8000);//I have no idea what this delay should be
  }
  return i+1;
}

function geo2zip(a) {
  var response=Maps.newGeocoder().reverseGeocode(lat(a),long(a));
  return response.results[0].formatted_address.split(',')[2].trim().split(' ')[1];
}
function lat(pointa) {
  var response = Maps.newGeocoder().geocode(pointa);
  return response.results[0].geometry.location.lat
}
function long(pointa) {
  var response = Maps.newGeocoder().geocode(pointa);
  return response.results[0].geometry.location.lng
}

Я запускаю его из таймера JavaScript и пробую запускать каждые 6 минут. Я не знаю, будет ли withSuccessHandler () ждать так долго, поэтому вам может потребоваться сохранить возвращаемое значение, которое сообщает циклу, с чего каждый раз начинать считать. Возможно, вы могли бы хранить в PropertiesService. Это займет около 15 часов.

Использование геокодирования и биллинг API

API геокодирования Начало работы

Пример таймера Javascript

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

Создание, изменение или закрытие платежного аккаунта

...