我想要完成的事情看起来应该是非常简单的,但是我是在碰壁。我有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 ()