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
相关产品推荐
相关产品推荐

