麻烦的API拉XML到谷歌表与应用程序脚本



我想要完成的事情看起来应该是非常简单的,但是我是在碰壁。我有API调用工作。我可以把数据拉进App Script,我的问题是操纵它到一个表。这是XML:

<advanced_computer_search>
<id>6</id>
<name>_Java-Version</name>
<view_as>Standard Web Page</view_as>
<sort_1/>
<sort_2/>
<sort_3/>
<criteria>
<size>0</size>
</criteria>
<display_fields>
<size>4</size>
<display_field>
<name>Computer Name</name>
</display_field>
<display_field>
<name>Operating System Version</name>
</display_field>
<display_field>
<name>Java Version</name>
</display_field>
<display_field>
<name>Last Check-in</name>
</display_field>
</display_fields>
<computers>
<size>48</size>
<computer>
<name>TEST-MBP-CWP</name>
<udid>103481203840912384098213409</udid>
<id>14</id>
<Computer_Name>TEST-MBP-CWP</Computer_Name>
<Operating_System_Version>12.6.0</Operating_System_Version>
<Java_Version/>
<Last_Check_in>2022-11-10 10:42:29</Last_Check_in>
</computer>
<computer>
<name>test-mbp (3)</name>
<udid>103481203840912384098213407</udid>
<id>22</id>
<Computer_Name>test-mbp (3)</Computer_Name>
<Operating_System_Version>12.6.0</Operating_System_Version>
<Java_Version/>
<Last_Check_in>2022-11-09 13:32:15</Last_Check_in>
</computer>
<computer>
<name>test-mbp19</name>
<udid>103481203840912384098213408</udid>
<id>24</id>
<Computer_Name>test-mbp19</Computer_Name>
<Operating_System_Version>11.7.0</Operating_System_Version>
<Java_Version>1.8.0_201</Java_Version>
<Last_Check_in>2022-10-18 13:18:26</Last_Check_in>
</computer>
<computer>
<name>TEST-2019-MBP-I5</name>
<udid>103481203840912384098213406</udid>
<id>43</id>
<Computer_Name>TEST-2019-MBP-I5</Computer_Name>
<Operating_System_Version>12.5.1</Operating_System_Version>
<Java_Version/>
<Last_Check_in>2022-11-09 18:30:29</Last_Check_in>
</computer>
</computers>
<site>
<id>-1</id>
<name>None</name>
</site>
</advanced_computer_search>

我想要得到的是一个表的计算机与顶部的行:(name, udid, id, Computer_Name, Operating_System_Version, Java_Version, Last_Check_in)

那么接下来的x行就是所有的数据。

//Query jamf 
var url = '<MY URL)>;
var jamfXml = UrlFetchApp.fetch(url, {
"method": "GET",
"headers": {
"Authorization": "MY AUTH",
"Content-Type": "application/xml"
},
}).getContentText();
//console.log(jamfXml);
var document = XmlService.parse(jamfXml);
var computers = document.getRootElement().getChildren("computers");
//console.log(computers);
var computersLength = document.getRootElement().getChild("computers").getChild("size").getValue();

我认为会有一个动态的方式来获得元素标签到顶行,所以相同的脚本可以重用,而不需要太硬的代码列标题或列的数量。然后将动态数据放入以下行中。我就是不知道怎么回事。

感谢您的帮助。

我尝试的是上面代码的不同版本,其中有2到3个嵌套的foreach循环。类似于:

var listComputers=[]

console.log(computers.length)
//console.log(computers[0][0].length)
computers.forEach(function(item){
//console.log(item.getValue());
var computer=[]
item.getChildren().forEach(function(details){
//console.log(details.getValue());
details.getChildren().forEach(function(moreDetails){
//console.log(moreDetails.getValue());
computer.push(moreDetails.getValue());
})
})
listComputers.push(computer);
})
console.log(listComputers);
console.log(listComputers[0].length);
console.log(listComputers[0][1].length);
console.log(listComputers[0][1]);

不包括写入工作表,我已经能够做到这一点,但数据最终都连接到单个单元格。

修改点:

  • 在你的脚本中,我认为var computer = []listComputers.push(computer);需要放到item.getChildren().forEach(function (details) {,,,})的循环中

  • 而且,在您的脚本中,<size>48</size>也被检索。

当这些点反映在脚本中时,它变成如下所示:

修改脚本:

:

computers.forEach(function(item){
//console.log(item.getValue());
var computer=[]
item.getChildren().forEach(function(details){
//console.log(details.getValue());
details.getChildren().forEach(function(moreDetails){
//console.log(moreDetails.getValue());
computer.push(moreDetails.getValue());
})
})
listComputers.push(computer);
})

:

computers.forEach(function (item) {
item.getChildren().forEach(function (details) {
if (details.getName() == "computer") {
var computer = []
details.getChildren().forEach(function (moreDetails) {
computer.push(moreDetails.getValue());
});
listComputers.push(computer);
}
});
});
  • 通过此修改,<computer>标签的每个值都以数组的形式检索。

注意:

  • 如果<computer>标签中的标签顺序可能会改变,我认为下面的示例脚本可能也很有用。在这个示例中,标题的顺序是恒定的。而且,在这个样例脚本中,它假设jamfXml是显示样例XML数据。请小心点。

    var url = '<MY URL)>';
    var jamfXml = UrlFetchApp.fetch(url, {
    "method": "GET",
    "headers": {
    "Authorization": "MY AUTH",
    "Content-Type": "application/xml"
    },
    }).getContentText();
    var headers = ["name", "udid", "id", "Computer_Name", "Operating_System_Version", "Java_Version", "Last_Check_in"];
    var document = XmlService.parse(jamfXml);
    var root = document.getRootElement();
    var ns = root.getNamespace();
    var values = root.getChild("computers", ns).getChildren("computer", ns).map(e => headers.map(h => e.getChild(h, ns).getValue() || ""));
    console.log(values);
    

引用:

  • XML服务
  • map ()

相关内容

最新更新