簡體   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