如何遍历多个URL以在Google Apps脚本中获取JSON响应?

sab*_*abs 2 javascript loops urlfetch google-apps-script

我正在使用Google Apps脚本中的第三方API(来自名为Simpli.fi的公司)将一些数据提取到电子表格中。我能够对我的API调用进行身份验证,并且可以使用一个URL提取所有我需要的数据。问题在于,用于调用此API的URL的格式如下:

https://app.simpli.fi/api/organizations/ {CLIENT_ID} / {SOME_ENDPOINT}

当我插入一个客户端ID和一个端点时,它可以工作,但是我不想为每个客户端和每个数据端点分别提取数据。

我希望提取所有客户端上的数据,也希望访问多个端点,例如“ /audiences”或“ /campaigns”。我希望有一种方法(类似承诺的JavaScript),我可以通过多个网址进行迭代,以从API获取的所有数据。

目前,我只是专注于从/audiences所有客户端的“ ”端点提取所需的所有数据。我已经设置了一个访问我的Google表格的数组,其中包含所有客户端代码,并将其插入到带有for循环的URL中,这很好用:

// iterate through all URL endpoints and client codes
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('formatting');

var range = sheet.getRange(['B2:B']).getValues();
var clients = range.filter(String);
var urlOneArray = [];

for (var i = 0; i < clients.length; i++) {
  var urlOne = [baseURL + clients[i] + '/audiences'];
  for (var j = 0; j < urlOne.length; j++) {
    urlOneArray = urlOne[j];
    Logger.log(urlOneArray);
  }
}
Run Code Online (Sandbox Code Playgroud)

上面记录了所需的每个内置URL的列表。

将所有内置URL推送到后urlOneArray,我尝试使用调用UrlFetchApp.fetchAll

for (i=0; i < urlOneArray.length; i++) {
  var response = UrlFetchApp.fetchAll(urlOneArray[i], params);
  Utilities.sleep(500);
  Logger.log(response);
}
Run Code Online (Sandbox Code Playgroud)

尝试使用此方法时,出现以下错误:

“找不到方法fetchAll(string,object)。(第35行,文件“ Code”)”

如果有一种方法可以遍历多个URL,一次就能从API收集所有数据,那么我将非常感谢一些指针。

这是完整的脚本:

// authenticate API call
var X_USER_KEY = 'XXXX'; 
var X_APP_KEY = 'XXXX'; 

function simplifiService() {
  var baseURL = 'https://app.simpli.fi/api/organizations';

  // iterate through all URL endpoints and client codes
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('formatting');

  var range = sheet.getRange(['B2:B']).getValues();
  var clients = range.filter(String);
  var urlOneArray = [];

  for (var i = 0; i < clients.length; i++) {
    var urlOne = [baseURL + clients[i] + '/audiences'];
    for (var j = 0; j < urlOne.length; j++) {
      urlOneArray = urlOne[j];
      Logger.log(urlOneArray);
    }
  }

  var params = {
    method: 'GET',
    headers: {
      "x-app-key": X_APP_KEY,
      "x-user-key": X_USER_KEY
    },
    muteHttpExceptions: true
  }


  for (i=0; i < urlOneArray.length; i++) {
    var response = UrlFetchApp.fetchAll(urlOneArray[i], params);
    Utilities.sleep(500);
    Logger.log(response);
  }  

  if (response.getResponseCode() === 200) {
    var data = JSON.parse(response);
    Logger.log(data);
  } else {
    Logger.log('Error: ' + response.getResponseCode());
  }
  getData(data);
}

// parse out JSON data
function getData(data) {
  var date = new Date();

  var geoFenceId = data.audiences;
  var geoFenceName = data.audiences[0].name;

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Campaign Data');
  //sheet.appendRow([date, geoFenceId, geoFenceName]);
}
Run Code Online (Sandbox Code Playgroud)

The*_*ter 5

问题:

  • 语法无效: 当您提供字符串和对象作为参数时,UrlFetchApp.fetchAll(请求Object [])接受对象数组。

解:

  • 有效语法:为每个端点/客户端创建一个对象数组,并将其作为参数提供给fetchAll()

片段:

function copyParams() {//shallow clone params object
  for (var i in params) {
    this[i] = params[i];
  }
}
var endPoints = ['/audiences', '/campaigns'];
var requests = [];
var url, obj;
clients.forEach(function(client) {
  endPoints.forEach(function(endPoint) {
    obj = new copyParams();
    url = baseUrl + '/' + client[0] + endPoint;
    obj.url = url;
    requests.push(obj);
  });
});
console.log(requests);
var responseArray = UrlFetchApp.fetchAll(requests);
console.log(responseArray);
Run Code Online (Sandbox Code Playgroud)

参考文献: