Как можно перебрать несколько URL-адресов, чтобы получить ответ JSON в скрипте Google Apps? - PullRequest
2 голосов
/ 19 июня 2019

Я работаю со сторонним API (от компании Simpli.fi) в Google Apps Script , чтобы перенести некоторые данные в электронную таблицу. Я могу очень хорошо аутентифицировать мой вызов API и получить все необходимые данные по одному URL. Проблема в том, что URL для вызова этого API отформатирован следующим образом:

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

Это работает, когда я подключаю один идентификатор клиента и одну конечную точку, однако я не хочу получать данные отдельно для каждого клиента с каждой конечной точкой данных.

Я хочу получить данные обо всех моих клиентах, а также хочу получить доступ к нескольким конечным точкам, таким как "/audiences" или "/campaigns". Я надеюсь, что есть способ (подобный Promises в JavaScript ), который я могу перебирать по нескольким URL-адресам для получения всех данных из API.

На данный момент я просто концентрируюсь на извлечении всех данных, которые я хочу, из конечной точки "/audiences" для всех моих клиентов. Я настроил массив для доступа к моему Google Sheet , который содержит все клиентские коды, и вставил его в URL с помощью цикла for, который работает просто отлично:

// 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);
  }
}

Вышеприведенный журнал регистрирует список каждого встроенного 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);
}

При попытке использовать этот метод я получаю эту ошибку:

"Не удается найти метод fetchAll (строка, объект). (Строка 35, файл" Код ")"

Если есть способ перебирать несколько 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]);
}

1 Ответ

5 голосов
/ 19 июня 2019

Проблема:

  • Неверный синтаксис: 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);

Ссылки:

...