在Google App Script中内存直接解析XLSX响应为JSON时遇压缩方法不支持错误的解决方法
在Google App Script中内存直接解析XLSX响应为JSON时遇压缩方法不支持错误的解决方法
我来帮你解决这个问题!你遇到的Unsupported ZIP Compression method NaN错误,核心原因是Google Apps Script中Blob.getBytes()返回的是有符号字节数组(元素范围-128到127),而SheetJS(xlsx.js)解析时需要的是无符号字节数组(元素范围0到255),两者的字节值表示不一致,导致XLSX文件的ZIP压缩格式无法被正确识别。
下面是修正后的完整代码,全程在内存中处理,无需保存到Drive:
function parseExcelToJson() { try { // Step 1: 从URL获取Excel文件 const response = UrlFetchApp.fetch('https://www.nasdaqtrader.com/Content/ProductsServices/TRADING/TRF-Chicago-Test-Securities.xlsx'); // Step 2: 将响应转为内存Blob对象 const blob = response.getBlob(); // Step 3: 获取GAS默认的有符号字节数组 const signedByteArray = blob.getBytes(); // 关键修正:把有符号字节数组转成SheetJS需要的无符号Uint8Array const uint8Array = new Uint8Array(signedByteArray.map(byte => byte < 0 ? byte + 256 : byte)); // Step 4: 用SheetJS解析无符号字节数组 const data = XLSX.read(uint8Array, { type: 'array' }); // Step 5: 定位到第一个工作表 const sheet = data.Sheets[data.SheetNames[0]]; // Step 6: 将工作表数据转为JSON格式 const json = XLSX.utils.sheet_to_json(sheet); // Step 7: 输出并返回结果 console.log(JSON.stringify(json, null, 2)); return json; } catch (e) { // 输出更详细的错误信息用于调试 console.error(`解析出错:${e.message}\n堆栈信息:${e.stack}`); return null; } }
核心问题与修正解释
- 字节类型不匹配:Google Apps Script的
getBytes()返回的字节是带符号的(负数表示大于127的字节值),而SheetJS解析ZIP格式(XLSX本质是ZIP包)时,需要无符号的字节值才能正确识别压缩算法,这就是你遇到Unsupported ZIP Compression method NaN的根本原因。 - 日志优化:替换了原生
Logger.log为console系列方法,能在脚本编辑器的日志面板看到更清晰的结构化输出。
额外注意事项
- 请确保SheetJS的
xlsx.full.min.js已经正确添加到你的GAS项目:可以通过脚本编辑器的「扩展程序」→「Apps Script 库」添加,或者直接将库的完整代码粘贴到项目的新脚本文件中。 - 首次测试时,建议先通过
console.log查看JSON输出,确认解析后的数据结构符合预期。
备注:内容来源于stack exchange,提问作者Scriphy
相关产品推荐
相关产品推荐

