【问题标题】:Trouble with API pull of XML into Google Sheet with App Script使用 App Script 将 XML 的 API 拉入 Google Sheet 的问题
【发布时间】:2022-11-12 09:04:44
【问题描述】:

我想要完成的事情似乎应该很简单,但我正在用头撞墙。我有 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>

` 我正在寻找的是一张用于顶行计算机的表格: (名称、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]);

`

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

【问题讨论】:

    标签: javascript arrays xml google-sheets datatable


    【解决方案1】:

    修改点:

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

    • 而且,在你的脚本中,&lt;size&gt;48&lt;/size&gt; 也会被检索到。

    当这些点反映在你的脚本中时,它变成如下。

    修改后的脚本:

    从:

    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);
        }
      });
    });
    
    • 通过此修改,&lt;computer&gt; 标签的每个值都在数组中检索。

    笔记:

    • 如果&lt;computer&gt; 标签中的标签顺序可能会改变,我认为下面的示例脚本也可能有用。在此示例中,标题标题的顺序是不变的。而且,在这个示例脚本中,它假设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);
      

    参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 2022-06-15
      相关资源
      最近更新 更多