简体   繁体   English

我如何使用 Google Apps 脚本解析 XML 并遍历所有元素

[英]Ho do I Parse XML using Google Apps Script and loop through all elements

This is my first time working with XML and I am not that techy but trying to get to understand programming to make my work easier.这是我第一次使用 XML,我不是那么技术化,而是试图了解编程以使我的工作更轻松。 I am using Google App script and finding it a challenge in passing XML data that I get via API.我正在使用 Google App 脚本并发现传递我通过 API 获得的 XML 数据是一个挑战。

I need to get this data so that I can set the specific values to Google sheets using google app script.我需要获取这些数据,以便我可以使用 google 应用程序脚本将特定值设置为 Google 表格。

I am not sure how to iterate/loop through elements to get everyone's data and then set it to google sheet.我不确定如何迭代/循环元素以获取每个人的数据,然后将其设置为谷歌表。

And here is the code I have worked on so far.这是我迄今为止工作的代码。 When I log to say the first name, I only get one name instead of about 50 names in the system.当我登录时说出第一个名字,我只得到一个名字,而不是系统中的大约 50 个名字。 Any help here will highly be appreciated.这里的任何帮助将不胜感激。

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

Sample 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>

If I understand correctly, the problem is that you have multiple <Request> elements, but your code is only looking at one of them.如果我理解正确,问题是您有多个<Request>元素,但您的代码只查看其中一个。 This is because you're using getChild() , which will only provide the first element with the given name.这是因为您使用的是getChild() ,它只会提供具有给定名称的第一个元素。

I can't fully test that this works because you haven't provided the XML text, but you should instead use the getChildren() method to get all of the Request elements.我无法完全测试这是否有效,因为您尚未提供 XML 文本,但您应该使用getChildren()方法来获取所有 Request 元素。 Then you can loop through that.然后你可以遍历它。

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

Since I don't know how you're printing, I created an array of request objects and logged that in the sample above.由于我不知道您是如何打印的,因此我创建了一个请求对象数组并将其记录在上面的示例中。 I hope this made sense, but please let me know if you have any questions or if I'm completely off with my response.我希望这是有道理的,但如果您有任何问题或者我完全不同意我的回答,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM