l oop на страницах API карты Google в скрипте Google - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь получить данные из API карты Google и поместить их в листы Google, я создал al oop

, чтобы получить данные со следующей страницы токена.

Первая функция заключается в получить местоположение из ячейки на листе

вторая функция - получить первую страницу и l oop - на следующие страницы

третья функция - l oop на следующих страницах

но, похоже, проблема в третьей функции, может быть, причина в том, что fetch не читает Url. Я не знаю, почему

результаты: я получил первые 20 строк, а затем код (Исключение: число строк в диапазоне должно быть хотя бы 1.)

может кто-нибудь дать мне несколько советов или исправить то, что я сделал не так, пожалуйста? заранее спасибо

function APIfromLoc(){
  var ss = SpreadsheetApp.openById('1kiecwnIEHNvTz3VD8AjPT0CK8HvqmzCi86vXRyrU4lc');
  var sheet = ss.getSheetByName('Sheet1');

  var location = sheet.getRange(1,1).getValue();

  callAPIinit(location);

}

// function to call the first page api 
function callAPIinit(location) {
  var ss = SpreadsheetApp.openById('1kiecwnIEHNvTz3VD8AjPT0CK8HvqmzCi86vXRyrU4lc');
  var sheet = ss.getSheetByName('Sheet2');

  var API_key = '';
  //var location = ' ' ;
  var Url = 'https://maps.googleapis.com/maps/api/place/textsearch/json?location='+location+'&raduis=50000&type=restaurant&key='+API_key;

  var response = UrlFetchApp.fetch(Url);



  // Parse the JSON reply
  var json = response.getContentText();
  var data = JSON.parse(json);


  var results = data["results"];

  var token = data["next_page_token"];

  var output = []

  results.forEach(function(elem,i) {

    output.push([elem["formatted_address"],elem["geometry"]["location"]["lat"],elem["geometry"]["location"]["lng"],elem["geometry"]["viewport"]["northeast"]["lat"],elem["geometry"]["viewport"]["northeast"]["lng"],elem["geometry"]["viewport"]["southwest"]["lat"],elem["geometry"]["viewport"]["southwest"]["lng"],elem["id"],elem["name"],elem["place_id"],elem["plus_code"]["compound_code"],elem["plus_code"]["global_code"],elem["rating"],elem["reference"],elem["types"][0],elem["types"][1],elem["types"][2],elem["types"][3],elem["price_level"],elem["user_ratings_total"]]);
   // sheet.setRowHeight(i,65);
  });

    // adds an index number to the array
  output.forEach(function(elem,i) {
    elem.unshift(i + 1);
  });

  var len = output.length;


  // paste in the values
  sheet.getRange(2,1,len,21).setValues(output);
  sheet.getRange(1,1).setValue(token);

 Next_pages(Url);
}

/**
--------------------------------------------------------------------------------------------------------------------------------------------------------------
 */

// function to call the next pages using first page token 
function Next_pages(Url) {


  var ss = SpreadsheetApp.openById('1kiecwnIEHNvTz3VD8AjPT0CK8HvqmzCi86vXRyrU4lc');
  var sheet = ss.getSheetByName('Sheet2');
  var token = sheet.getRange(1,1).getValue();
  Url = Url + "&pagetoken=" + token;
 Logger.log(Url)
 //loop to get all pages  
  do{

  //var location = ' ' ;
 // var Url = Url+'&pagetoken='+token;

  var response = UrlFetchApp.fetch(Url);
  var json = response.getContentText();

  var data = JSON.parse(json);
  Logger.log(data)
  var results = data["results"];
  token = []; 
  token = data["next_page_token"];

  var output = []

  results.forEach(function(elem,i) {

    output.push([elem["formatted_address"],elem["geometry"]["location"]["lat"],elem["geometry"]["location"]["lng"],elem["geometry"]["viewport"]["northeast"]["lat"],elem["geometry"]["viewport"]["northeast"]["lng"],elem["geometry"]["viewport"]["southwest"]["lat"],elem["geometry"]["viewport"]["southwest"]["lng"],elem["id"],elem["name"],elem["place_id"],elem["plus_code"]["compound_code"],elem["plus_code"]["global_code"],elem["rating"],elem["reference"],elem["types"][0],elem["types"][1],elem["types"][2],elem["types"][3],elem["price_level"],elem["user_ratings_total"]]);
   // sheet.setRowHeight(i,65);
  });

    // adds an index number to the array
  output.forEach(function(elem,i) {
    elem.unshift(i + 1);
  });

  var len = output.length;

  // paste in the values
  sheet.getRange(sheet.getLastRow()+1,1,len,21).setValues(output);
  sheet.getRange(1,1).clearContent();

} while(token != Null)
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

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

Когда квота достигнута, вместо возврата списка местоположений, API возвращает эту ошибку:

{error_message=You have exceeded your daily request quota for this API. If you did not set a custom daily request quota, verify your project has an active billing account: http://g.co/dev/maps-no-account, status=OVER_QUERY_LIMIT, results=[], html_attributions=[]}

Если вы заметили этот ответ об ошибке, поле results является пустым массивом. В результате output также является пустым массивом, поэтому output.length; равен 0. Затем вы пытаетесь получить диапазон с числом строк (len), равным 0, что объясняет ошибку, с которой вы столкнулись. получение.

Чтобы просмотреть текущие ограничения квоты, вы можете выполнить эти шаги .

Примечание:

  • Существует опечатка в вашем URL: raduis не является допустимым параметром запроса; должно быть radius вместо.

Ссылка:

0 голосов
/ 16 апреля 2020

спасибо за вашу помощь, похоже, что токену следующей страницы нужно время для появления, поэтому я добавил Utilities.sleep(10000) на следующие страницы l oop.

ссылка Пейджинг в Google Places API возвращает статус INVALID_REQUEST

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