Инкрементное смещение в вызове Api - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно получить все результаты при вызове API. Я получаю только 100. Я знаю, что я должен компенсировать каждые 100, чтобы получить все. Не знаю, сколько всего результатов. Я думаю, мне следует использовать «пока», пока API не скажет, что результатов больше нет ... или что-то в этом роде ... но я абсолютный новичок в javascript, поэтому я не знаю, где его удобно разместить и как это реализовать. Я использую Google App Scripts для вставки результатов в Google Sheet. Я пытался использовать функцию "while", но я не знаю, является ли это правильным местом для ее реализации ... и если переменные в порядке или нет. Смотрите комментарий // L oop Это мой код:

var APIurl = 'http://api.elit.com.ar/productos?offset=';
var offset = 0

function callAPI() {
  //Access Data
 var token = Utilities.base64Encode('mytoken');

  var auth =  {
    user_id: 'myid',
    token: token,}    

  var options = {
    muteHttpExceptions: true,
    method: 'POST',
    payload: JSON.stringify(auth),
    }

  // Call API
  var response = UrlFetchApp.fetch(APIurl, options);

  //Parse response
  var json= response.getContentText();
  return JSON.parse(json)
}  

function displayData(){

  var data = callAPI();
  var results = data["resultado"];
  var output = []

  results.forEach(function(elem,i) {
  output.push([elem["cod_alfa"],elem["detalle"],elem["precio"]]);
  });

  //Loop
  while (results !== null){
  callAPI(APIurl + offset + 100);
  };

  //Clear previous content
  var ss = SpreadsheetApp.openByUrl('mygooglesheeturl').getSheetByName('sheetname');
  ss.getRange(1,1,500,3).clearContent();

  //Insert new data in sheet
  var len = output.length;
  ss.getRange(1,1,len,3).setValues(output);
  Logger.log(output);


}

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Спасибо @Barman, это рабочий код:

    var url = 'http://YOUR_URL?offset=';

function callAPI(url) {
  //Access Data
 var token = Utilities.base64Encode('YOUR_TOKEN');

  var auth =  {
    user_id: 'YOUR_USER_ID',
    token: token,}    

  var options = {
    muteHttpExceptions: true,
    method: 'POST',
    payload: JSON.stringify(auth),
    }

  // Call API
  var response = UrlFetchApp.fetch(url, options);

  //Parse response
  var json= response.getContentText();
  return JSON.parse(json);

}  


function displayData(){

  var output = []
  var offset = 0

  while (true) {
    var results = callAPI(url + offset).resultado;

    results.forEach(function (obj) {
    return output.push([obj.cod_alfa, obj.partnumber, obj.detalle, obj.precio, obj.iva, obj.marca, obj.rubro, obj.subrubro, obj.cotizacion, obj.stock, obj.peso, obj.link]);
    }); //REPLACE obj.YOUR_DATA

    if (results.length < 100) {
      break;
    }
    offset += 100;
  }



  //Clear previous content
  var ss = SpreadsheetApp.openByUrl('YOUR_GOOGLE_SPREADSHEET_URL').getSheetByName('YOUR_SHEET_NAME');
  ss.getRange(4,1,2000,12).clearContent();

  //Insert new data in sheet
  var len = output.length;
  ss.getRange(4,1,len,12).setValues(output);
  Logger.log(output);
}
0 голосов
/ 28 февраля 2020

Вы передаете URL в качестве аргумента callAPI(), но функция не использует этот параметр.

function callAPI(url) {
  //Access Data
 var token = Utilities.base64Encode('mytoken');

  var auth =  {
    user_id: 'myid',
    token: token,}    

  var options = {
    muteHttpExceptions: true,
    method: 'POST',
    payload: JSON.stringify(auth),
    }

  // Call API
  var response = UrlFetchApp.fetch(url, options);

  //Parse response
  var json= response.getContentText();
  return JSON.parse(json)
}  

Вы не обновляете переменную offset. offset всегда 0, поэтому offset + 100 всегда 100. И вы не используете значение, возвращаемое callAPI(). Значение l oop должно быть перед тем, как вы поместите sh все в массив output, или вы можете сделать это внутри while l oop.

function displayData(){

  var output = []
  var offset = 0

  while (true) {
    var results = callAPI(APIUrl + offset).resultado;
    results.forEach(obj => output.push([obj.code_alfa, obj.detalle, obj.precio]);
    if (result.length < 100) {
      break;
    }
    offset += 100;
  }


  //Clear previous content
  var ss = SpreadsheetApp.openByUrl('mygooglesheeturl').getSheetByName('sheetname');
  ss.getRange(1,1,500,3).clearContent();

  //Insert new data in sheet
  var len = output.length;
  ss.getRange(1,1,len,3).setValues(output);
  Logger.log(output);


}
...