IMPORTJSON в Google Sheet иногда не получает данные - PullRequest
0 голосов
/ 28 мая 2018

Я создал лист для хранения своих криптохранилищ.Я использую эту функцию importJSON, которую я нашел на YouTube: (Я изменил текст справки для себя)

/**
* Imports JSON data to your spreadsheet Ex: IMPORTJSON("https://api.coinmarketcap.com/v2/ticker/1/?convert=EUR","data/quotes/EUR/price")
* @param url URL of your JSON data as string
* @param xpath simplified xpath as string
* @customfunction
*/
function IMPORTJSON(url,xpath){

  try{
    // /rates/EUR
    var res = UrlFetchApp.fetch(url);
    var content = res.getContentText();
    var json = JSON.parse(content);

    var patharray = xpath.split("/");
    //Logger.log(patharray);

    for(var i=0;i<patharray.length;i++){
      json = json[patharray[i]];
    }

    //Logger.log(typeof(json));

    if(typeof(json) === "undefined"){
      return "Node Not Available";
    } else if(typeof(json) === "object"){
      var tempArr = [];

      for(var obj in json){
        tempArr.push([obj,json[obj]]);
      }
      return tempArr;
    } else if(typeof(json) !== "object") {
      return json;
    }
  }
  catch(err){
      return "Error getting data";  
  }

}

Я использую эту функцию для считывания API: Это часть моего скрипта:

  var btc_eur = IMPORTJSON("https://api.coinmarketcap.com/v2/ticker/1/?convert=EUR","data/quotes/EUR/price");
  var btc_btc = IMPORTJSON("https://api.coinmarketcap.com/v2/ticker/1/?convert=BTC","data/quotes/BTC/price");
  ss.getRange("B2").setValue([btc_eur]);
  ss.getRange("H2").setValue([btc_btc]);

  var bhc_eur = IMPORTJSON("https://api.coinmarketcap.com/v2/ticker/1831/?convert=EUR","data/quotes/EUR/price");
  var bhc_btc = IMPORTJSON("https://api.coinmarketcap.com/v2/ticker/1831/?convert=BTC","data/quotes/BTC/price");
  ss.getRange("B3").setValue([bhc_eur]);
  ss.getRange("H3").setValue([bhc_btc]);

Последние несколько дней я получаю ошибки «Ошибка при получении данных».Когда я запускаю скрипт вручную, он работает.

Я пробовал этот код, я нашел здесь:

ImportJson

function IMPORTJSON(url,xpath){
  var res = UrlFetchApp.fetch(url);
  var content = res.getContentText();
  var json = JSON.parse(content);
  var patharray = xpath.split("/");
  var res = [];
  for (var i in json[patharray[0]]) {
    res.push(json[patharray[0]][i][patharray[1]]);
  }
  return res;
}

Но это даетошибка об: TypeError: Невозможно прочитать свойство "кавычки" из нуля.Что я делаю не так?

1 Ответ

0 голосов
/ 28 мая 2018

Большая проблема - ваш API вызова скриптов как минимум 4 раза.Когда это делают лишь немногие пользователи, API-интерфейс сервера Google слишком часто вызывает вызов.

API Coinmarketcap имеет ограниченную пропускную способность.Когда любой клиент достигает этого предела, API возвращает HTTP error 429 .Google Scripts находится на общих серверах Google, это означает, что многие пользователи выглядят как один клиент для Coinmarketcap API.

Когда API отклоняет ваш запрос, ваш скрипт завершается неудачно - сообщение об ошибке соответствует предполагаемой ошибке (xpath не может найти кавычки компонент в пустой переменной).

Это безжалостное поведение.Пожалуйста, не разрушайте API с помощью массовых вызовов.

Вы можете загрузить данные из API сразу и повторно использовать их для каждого поиска в данных.

У меня есть похожая электронная таблицаавтоматически заполняется из Coinmarketcap API, вы можете скопировать его для:

Этот мой скрипт строго запрашивает API только один раз за все время выполнения и повторно использует один ответ для всех запросов.

Изменение вашего скрипта

Также вы можете внести несколько изменений в свой код для экономии ресурсов:

Измените IMPORTJSON функцию с этой:

function IMPORTJSON(url,xpath){
    var res = UrlFetchApp.fetch(url);
    var content = res.getContentText();
    var json = JSON.parse(content);
...

на эту:

function IMPORTJSON(json, xpath) {
...

и раздел кода rutime вы можете изменить следующим образом:

var res = UrlFetchApp.fetch("https://api.coinmarketcap.com/v2/ticker/1/?convert=EUR");
var content = res.getContentText();
var json = JSON.parse(content);

var btc_eur = IMPORTJSON(json,"data/quotes/EUR/price");
var btc_btc = IMPORTJSON(json,"data/quotes/BTC/price");
ss.getRange("B2").setValue([btc_eur]);
ss.getRange("H2").setValue([btc_btc]);
...

Главное преимущество: UrlFetchApp.fetch вызывается только один раз.

Да, я знаю, этот код неработает 1: 1 как твой.Это потому, что получить цены только за евро, а не за BTC.Естественно, извлечение сравнения между BTC и BTC не нужно, потому что это всегда 1 и другие значения, которые вы можете математически рассчитать по ответу EUR - пожалуйста, не злоупотребляйте API для таких запросов.

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