繁体   English   中英

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

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

这是我第一次使用 XML,我不是那么技术化,而是试图了解编程以使我的工作更轻松。 我正在使用 Google App 脚本并发现传递我通过 API 获得的 XML 数据是一个挑战。

我需要获取这些数据,以便我可以使用 google 应用程序脚本将特定值设置为 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>

如果我理解正确,问题是您有多个<Request>元素,但您的代码只查看其中一个。 这是因为您使用的是getChild() ,它只会提供具有给定名称的第一个元素。

我无法完全测试这是否有效,因为您尚未提供 XML 文本,但您应该使用getChildren()方法来获取所有 Request 元素。 然后你可以遍历它。

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

由于我不知道您是如何打印的,因此我创建了一个请求对象数组并将其记录在上面的示例中。 我希望这是有道理的,但如果您有任何问题或者我完全不同意我的回答,请告诉我。

暂无
暂无

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

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