咨询:在Google Apps Script中如何处理API返回的二进制数据
在Google Apps Script中处理API返回的二进制数据
你的当前代码尝试将二进制数据转为文本并解析为JSON,这会导致数据损坏——二进制内容(如示例中的zip压缩包)无法直接按文本格式处理。Google Apps Script提供了专门的内置方法来处理这类数据,具体操作如下:
1. 获取原始二进制数据
放弃使用getContentText(),改用HTTPResponse对象的getContent()方法,它会返回字节数组(Byte Array),这是处理二进制数据的正确形式:
let response = UrlFetchApp.fetch(url, fetchOptions); let binaryData = response.getContent(); // 获取原始二进制字节数组
2. 保存二进制文件到Google Drive
如果API返回的是zip压缩包,可直接将字节数组保存为Drive文件:
// 从响应头提取文件名(可选) let contentDisposition = response.getHeaders()['Content-Disposition']; let filename = contentDisposition.match(/filename=(.*)/)[1]; // 创建Drive文件 DriveApp.createFile(filename, binaryData, MimeType.ZIP);
3. (可选)解压并处理内部文件
若需要进一步处理zip内的CSV文件,可使用Utilities.unzip()方法解压字节数组:
let unzippedFiles = Utilities.unzip(binaryData); // unzippedFiles是Blob数组,每个元素对应zip内的一个文件 // 提取第一个CSV文件并转为文本 let csvBlob = unzippedFiles[0]; let csvText = csvBlob.getDataAsString(); // 解析CSV内容为二维数组 let csvData = Utilities.parseCsv(csvText);
完整示例代码
function fetchAndProcessBinaryReport() { const url = "你的API请求地址"; const fetchOptions = { // 配置请求参数(如授权头、请求方法等) headers: { "Authorization": "Bearer 你的访问令牌" } }; try { let response = UrlFetchApp.fetch(url, fetchOptions); let binaryData = response.getContent(); // 提取响应中的文件名 let contentDisposition = response.getHeaders()['Content-Disposition']; let filename = contentDisposition.match(/filename=(.*)/)[1]; // 将zip文件保存到Google Drive DriveApp.createFile(filename, binaryData, MimeType.ZIP); // 解压并将CSV内容写入Google Sheets let unzippedFiles = Utilities.unzip(binaryData); if (unzippedFiles.length > 0) { let csvText = unzippedFiles[0].getDataAsString(); let csvData = Utilities.parseCsv(csvText); let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData); } console.log("处理完成"); } catch (error) { console.error("请求或处理失败:", error); } }
内容的提问来源于stack exchange,提问作者Max S.
相关产品推荐
相关产品推荐

