You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script提取XML至表格:memoryEntries无返回值问题

问题原因

你的代码里systemEntries和memoryEntries都调用了HardwareReport.getChild('entries'),但XML的hardware_report节点下包含多个<entries>子节点(分别对应system、bios、memory等模块),getChild('entries')只会返回第一个匹配的节点(也就是name="system"的那个),所以memoryEntries实际上和systemEntries是同一个集合,自然找不到内存相关的字段。

另外,内存类型type并非直接在<entries name="memory">的子<entry>里,而是嵌套在<entries name="memory_bank">节点中,需要额外处理。

修复后的代码
function extrairDadosXML() {
  var pasta = DriveApp.getFolderById('pastaId'); // Insira o ID da pasta onde estão os arquivos XML
  var arquivos = pasta.getFiles();
  var planilha = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // 清空现有内容(可选,避免重复表头)
  planilha.clearContents();
  // Cabeçalho da planilha
  planilha.appendRow(["Manufacturer", "Model", "Serial", "Total Memory", "Total Slots", "Free Slots", "Memory Type"]);
  
  while (arquivos.hasNext()) {
    var arquivo = arquivos.next();
    if (arquivo.getName().split('.').pop() === 'xml') {
      var xml = XmlService.parse(arquivo.getBlob().getDataAsString());
      var root = xml.getRootElement();
      
      var hardwareReport = root.getChild('report').getChild('data').getChild('hardware_report');
      
      var systemEntryNode = null;
      var memoryEntryNode = null;
      
      // 获取hardware_report下所有entries节点,筛选出system和memory模块
      var allEntries = hardwareReport.getChildren('entries');
      allEntries.forEach(function(node) {
        var nodeName = node.getAttribute('name').getValue();
        if (nodeName === 'system') {
          systemEntryNode = node;
        } else if (nodeName === 'memory') {
          memoryEntryNode = node;
        }
      });
      
      var manufacturer, model, serial, totalMemory, totalSlots, freeSlots, memoryType;
      
      // 提取system模块数据
      if (systemEntryNode) {
        var systemEntries = systemEntryNode.getChildren('entry');
        systemEntries.forEach(function(entry) {
          var entryName = entry.getAttribute('name').getValue();
          switch(entryName) {
            case 'manufacturer':
              manufacturer = entry.getText();
              break;
            case 'model':
              model = entry.getText();
              break;
            case 'serial':
              serial = entry.getText();
              break;
          }
        });
      }
      
      // 提取memory模块数据
      if (memoryEntryNode) {
        var memoryEntries = memoryEntryNode.getChildren('entry');
        memoryEntries.forEach(function(entry) {
          var entryName = entry.getAttribute('name').getValue();
          switch(entryName) {
            case 'total_memory':
              totalMemory = entry.getText();
              break;
            case 'total_slots':
              totalSlots = entry.getText();
              break;
            case 'free_slots':
              freeSlots = entry.getText();
              break;
          }
        });
        
        // 提取内存类型(从非空的memory_bank中获取)
        var memoryBanks = memoryEntryNode.getChildren('entries').filter(function(bankNode) {
          return bankNode.getAttribute('name').getValue() === 'memory_bank';
        });
        
        memoryBanks.forEach(function(bank) {
          var bankEntries = bank.getChildren('entry');
          bankEntries.forEach(function(entry) {
            if (entry.getAttribute('name').getValue() === 'type') {
              var typeVal = entry.getText();
              // 跳过空插槽的类型
              if (typeVal !== 'Empty slot') {
                memoryType = typeVal;
              }
            }
          });
        });
      }
      
      // 写入行数据,空值用空字符串填充
      planilha.appendRow([
        manufacturer || '', 
        model || '', 
        serial || '', 
        totalMemory || '', 
        totalSlots || '', 
        freeSlots || '', 
        memoryType || ''
      ]);
    }
  }
}
关键修改点
  • 遍历hardware_report下的所有<entries>节点,通过name属性精准定位system和memory模块,不再只取第一个节点
  • 单独处理内存类型:从<entries name="memory_bank">中筛选非空插槽的type值
  • 增加空值判断,避免写入undefined到表格中
  • 可选添加清空表格内容的逻辑,防止重复运行时生成多份表头

内容的提问来源于stack exchange,提问作者Lucas Góes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:34:53