【问题标题】:Ho do I Parse XML using Google Apps Script and loop through all elements如何使用 Google Apps 脚本解析 XML 并遍历所有元素
【发布时间】:2020-02-07 08:09:50
【问题描述】:

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

我需要获取这些数据,以便我可以使用谷歌应用脚​​本将特定值设置为谷歌表格。

我不确定如何迭代/循环遍历元素以获取每个人的数据,然后将其设置为 google sheet。

这是迄今为止我编写的代码。当我登录说第一个名字时,我只得到一个名字而不是系统中的大约 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>

【问题讨论】:

  • 我认为当你的脚本中response的样本值作为文本值提供时,它会帮助用户思考解决方案。当然,请删除您的个人信息。还有,你能提供你期望的输出值吗?
  • @Tanaike 感谢您花时间查看代码。我已对其进行了编辑以包含示例响应。我需要的预期输出数据应该是响应中的所有子对象(即 TimeOffDate、LoginID 等)。我希望这有助于澄清?
  • 您现在提供了屏幕截图,但如果有人想帮助您,他需要手动输入 XML。如果您可以在问题中将其作为文本提供,我们可以简单地将其复制并开始测试代码。
  • @Casper,感谢您的推荐。问题现已编辑。
  • 感谢您的回复。我注意到你的问题已经解决了。很高兴您的问题得到解决。

标签: javascript xml for-loop google-apps-script google-sheets


【解决方案1】:

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

我无法完全测试这是否有效,因为您没有提供 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));
}

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

【讨论】:

  • 谢谢,迭戈,这很有意义。通过这个解决方案,我将能够在谷歌表中设置值。
  • 嘿迭戈,只是一个快速的。我也想在 XML 中获取父数据,这些不是子数据。我如何将这些推送到我的数组中
  • @Just 你的意思是 ID 和 Status 值?
  • 是的,迭戈,我就是这个意思
  • @Just Use getAttribute()... 例如request.getAttribute("ID")
猜你喜欢
  • 2014-12-19
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多