Как мне разобрать XML с помощью Google Apps Script и l oop через все элементы - PullRequest
1 голос
/ 07 февраля 2020

Я впервые работаю с XML, и я не настолько умен, но пытаюсь понять программирование, чтобы облегчить свою работу. Я использую скрипт Google App и считаю, что это затрудняет передачу XML данных, которые я получаю через API.

Мне нужно получить эти данные, чтобы я мог установить указанные значения c для листов Google, используя Сценарий приложения Google.

Я не уверен, как выполнить итерацию / l oop элементов, чтобы получить данные каждого пользователя, а затем установить их на листе Google.

И вот код, который я работал до сих пор. Когда я регистрируюсь, чтобы произнести имя, я получаю только одно имя вместо примерно 50 имен в системе. Любая помощь здесь будет высоко оценена.

ak ='key'
start = '2019-01-01'
end = '2019-12-31'

function getData() { 

 var options = {
    method: 'get',
    headers: {
        Authorization: 'Bearer ' + ak
    }
};  
var url = 'https://data.purelyhr.com/daily?ak='+ ak + '&sDate=' + start + '&eDate=' + end + '&TimeOffTypeName';
var response = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(response);
var root = document.getRootElement();


//set variables to data from PurelyHR

var TimeOffDate = root.getChild('Request').getChild('TimeOffDate').getText();
var TimeOffDayOfWeek = root.getChild('Request').getChild('TimeOffDayOfWeek').getText();
var TimeStart = root.getChild('Request').getChild('TimeStart').getText();
var TimeEnd = root.getChild('Request').getChild('TimeEnd').getText();
var TimeOffHours = root.getChild('Request').getChild('TimeOffHours').getText();
var TimeOffTypeName = root.getChild('Request').getChild('TimeOffTypeName').getText();
var LoginID= root.getChild('Request').getChild('LoginID').getText();
var Firstname = root.getChild('Request').getChild('Firstname').getText();
var Lastname = root.getChild('Request').getChild('Lastname').getText();
var UserCategory = root.getChild('Request').getChild('UserCategory').getText();
var SubmittedDate = root.getChild('Request').getChild('SubmittedDate').getText();
var Deducted = root.getChild('Request').getChild('Deducted').getText();
var Comment = root.getChild('Request').getChild('Comment').getText();


//populate the sheet with variable data


Logger.log(response)
}

Пример ответа

<?xml version='1.0' encoding='ISO-8859-1'?>
<DataService>
    <Request ID="1253" Status="Approved">
        <TimeOffDate>2020-02-07</TimeOffDate>
        <TimeOffDayOfWeek>Friday</TimeOffDayOfWeek>
        <TimeStart></TimeStart>
        <TimeEnd></TimeEnd>
        <TimeOffHours>8.000</TimeOffHours>
        <TimeOffTypeName>Annual Vacation</TimeOffTypeName>
        <LoginID>testuser</LoginID>
        <Firstname>test</Firstname>
        <Lastname>user</Lastname>
        <UserCategory></UserCategory>
        <SubmittedDate>2019-10-03</SubmittedDate>
        <Deducted>Yes</Deducted>
        <Comment>
            <![CDATA[* time-off request created by administrator]]>
        </Comment>
    </Request>
    <Request ID="126292" Status="Approved">
        <TimeOffDate>2020-02-07</TimeOffDate>
        <TimeOffDayOfWeek>Friday</TimeOffDayOfWeek>
        <TimeStart></TimeStart>
        <TimeEnd></TimeEnd>
        <TimeOffHours>8.000</TimeOffHours>
        <TimeOffTypeName>Annual Vacation</TimeOffTypeName>
        <LoginID>usertwo</LoginID>
        <Firstname>user</Firstname>
        <Lastname>two</Lastname>
        <UserCategory></UserCategory>
        <SubmittedDate>2019-10-15</SubmittedDate>
        <Deducted>Yes</Deducted>
        <Comment>
            <![CDATA[Neil (as my mentor)]]>
        </Comment>
    </Request>

1 Ответ

3 голосов
/ 07 февраля 2020

Если я правильно понимаю, проблема в том, что у вас есть несколько <Request> элементов, но ваш код просматривает только один из них. Это потому, что вы используете getChild(), который предоставит только первый элемент с указанным именем.

Я не могу полностью проверить, что это работает, потому что вы не предоставили текст XML, но вместо этого вы должны использовать метод getChildren(), чтобы получить все элементы Request , Затем вы можете выполнить l oop через это.

function getData() {
  var options = {
    method: 'get',
    headers: {
      Authorization: 'Bearer ' + ak
    }
  };
  var url = 'https://data.purelyhr.com/daily?ak=' + ak + '&sDate=' + start + '&eDate=' + end + '&TimeOffTypeName';
  var response = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(response);
  var root = document.getRootElement();

  //set variables to data from PurelyHR
  var requestElements = root.getChildren('Request'); // Get all <Request> elements
  var requestObjects = []; // Request objects for logging / eventual printing
  for (var i = 0; i < requestElements.length; i++) {
    var request = requestElements[i]; // A single <Request> element

    // Add to requestObjects array
    requestObjects.push({
      TimeOffDate: request.getChild('TimeOffDate').getText(),
      TimeOffDayOfWeek: request.getChild('TimeOffDayOfWeek').getText(),
      TimeStart: request.getChild('TimeStart').getText(),
      TimeEnd: request.getChild('TimeEnd').getText(),
      TimeOffHours: request.getChild('TimeOffHours').getText(),
      TimeOffTypeName: request.getChild('TimeOffTypeName').getText(),
      LoginID: request.getChild('LoginID').getText(),
      Firstname: request.getChild('Firstname').getText(),
      Lastname: request.getChild('Lastname').getText(),
      UserCategory: request.getChild('UserCategory').getText(),
      SubmittedDate: request.getChild('SubmittedDate').getText(),
      Deducted: request.getChild('Deducted').getText(),
      Comment: request.getChild('Comment').getText()
    });
  }

  Logger.log(JSON.stringify(requestObjects));
}

Поскольку я не знаю, как вы печатаете, я создал массив объектов запроса и зарегистрировал это в примере выше. Я надеюсь, что это имело смысл, но, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или я полностью не согласен с моим ответом.

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