Извлечение данных из API в электронную таблицу с помощью Google Appscript - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь построить электронную таблицу, основанную на превосходном API DataDT для 1-минутных данных Форекс. Все просто: для определенной даты и времени мне нужна цена открытия и закрытия из DataDT. Например, в следующих случаях Date + time являются входными данными, а Open и Close будут выходными данными.

Другими словами, это будет go из этого:

Date        Time    Pair    Open    Close
04/03/2019  20:30   USDJPY  
04/03/2019  21:30   USDJPY      
04/03/2019  22:41   USDJPY  

на это:

Date        Time    Pair    Open    Close
04/03/2019  20:30   USDJPY  111.478 111.475
04/03/2019  21:30   USDJPY  111.482 111.465 
04/03/2019  22:41   USDJPY  111.456 111.458

(ссылка на GSpreadsheet )

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

Пока это мой код в Google Appscript:

function callDataDT() {

  // Call the DataDT API
  var response = UrlFetchApp.fetch("http://www.datadt.com/api/data/AUDCAD/1/20190403/20190404?api_token=s3MoVn4GAJRJhKcdNJ6zZugFN2C92SBv");


  var json = response.getContentText();
  var data = JSON.parse(json);

}

function displayFXData() {

  // pick up the search term from the Google Sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  var datetime = sheet.getRange(2,13).getValue();

  var forexArray = [data]

  Logger.log(forexArray);

}

Чтобы возобновить, я пытаюсь понять, как 1) извлечь только объекты с датой-временем, равным date_time в электронной таблице, 2) вывести значения Open и Close для этого объекта в электронной таблице и 3) повторять для каждой непустой строки. Я заранее прошу прощения, если этот вопрос звучит слишком основательно c. Я все еще новичок с Javascript, но несколько дней пытался понять, как решить эту проблему, но безрезультатно. Я ценю любые советы, которые вы можете мне дать.

В качестве примечания, мне интересно, возможно ли изменить URL-адрес напрямую, чтобы он выводил только объекты с заданным date_time, но я не думаю, что это возможно.

Спасибо за чтение,

Дэвид .-

1 Ответ

2 голосов
/ 13 февраля 2020

Этот использует ваше значение фильтра

function getDataDT1(filter) {
  var sr=3
  var filter=filter||'';//You can test this function by providing a default here like '2019-04-03 20:28:00' 
  var r=UrlFetchApp.fetch("http://www.datadt.com/api/data/AUDCAD/1/20190403/20190404?api_token=s3MoVn4GAJRJhKcdNJ6zZugFN2C92SBv");
  var data=JSON.parse(r.getContentText("UTF-8"));
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  sh.clearContents();
  var pair='USDJPY';
  var a=[['','','Without V8','',''],['Date','Time','Pair','Open','Close']];
  if(filter) {//if the filter is null then no filtering takes place
    var dat=new Date(filter);
    var dtv=new Date(dat.getFullYear(),dat.getMonth(),dat.getDate(),dat.getHours(),dat.getMinutes()).valueOf();
  }
  data.forEach(function(r,i){
    var dt=r.DATE_TIME.split(' ');
    var sd=new Date(r.DATE_TIME);
    var sdv=new Date(sd.getFullYear(),sd.getMonth(),sd.getDate(),sd.getHours(),sd.getMinutes()).valueOf();
    if(sdv==dtv || !filter) {//no filtering if filter is null
      var d=dt[0].split('-');
      var t=dt[1].split(':');
      var ds=Utilities.formatString('%s/%s/%s',d[1],d[2],d[0]);
      var ts=Utilities.formatString('%s:%s',t[0],t[1]);
      a.push([ds,ts,pair,data[i].OPEN.toFixed(3),data[i].CLOSE.toFixed(3)]);
    }
  });
  if(a) {
    sh.getRange(sh.getLastRow()+1,1,a.length,a[0].length).setValues(a);
  }else{
     SpreadsheetApp.getUi().alert('No items found');
  }
}
...