如何在Apps Script中并行解析JSON,优化Looker Studio连接器性能?
解决Google Apps Script中JSON解析性能瓶颈的方案
一、优先压缩响应体积(最简便有效)
如果API支持字段筛选或数据分片,直接在请求阶段只获取Looker Studio需要的内容——JSON解析耗时和数据量正相关,把100MB的响应压缩到更小尺寸,解析速度会直接提升:
- 给API请求添加
fields参数,仅指定所需字段 - 按时间、ID等维度拆分请求,减少单响应的数据量
二、拆分缓存原始响应文本(绕过CacheService限制)
针对CacheService单键100KB的限制,把大体积的原始响应拆分成多个分片存储,读取时再拼接还原:
// 拆分原始响应并缓存 function cacheRawResponse(url, rawText) { const cache = CacheService.getScriptCache(); const chunkSize = 95 * 1024; // 留余量避免触发单键限制 const chunks = []; for (let i = 0; i < rawText.length; i += chunkSize) { chunks.push(rawText.slice(i, i + chunkSize)); } // 存储分片总数 cache.put(`${url}_chunkCount`, chunks.length.toString(), 3600); // 逐个存储分片 chunks.forEach((chunk, index) => { cache.put(`${url}_chunk_${index}`, chunk, 3600); }); } // 从缓存读取并还原原始响应 function getCachedRawResponse(url) { const cache = CacheService.getScriptCache(); const chunkCountStr = cache.get(`${url}_chunkCount`); if (!chunkCountStr) return null; const chunkCount = parseInt(chunkCountStr); const chunks = []; for (let i = 0; i < chunkCount; i++) { const chunk = cache.get(`${url}_chunk_${i}`); if (!chunk) return null; // 分片丢失则缓存失效 chunks.push(chunk); } return chunks.join(''); }
使用逻辑:先调用getCachedRawResponse,有缓存直接解析;无缓存则发起API请求,再调用cacheRawResponse存储原始文本。
三、利用独立脚本实例实现并行解析
Apps Script主线程为单线程,但可以通过部署独立脚本为Web服务,将解析任务分发到多个独立执行实例,实现并行处理:
- 新建独立Apps Script项目,编写解析函数并部署为Web App(权限设为“以我自己的身份执行”,允许任何人访问):
// 独立脚本的Web App处理函数 function doPost(e) { const rawJson = e.parameter.rawJson; const parsedData = JSON.parse(rawJson); // 可在此仅提取Looker Studio需要的字段,减少返回数据量 return ContentService.createTextOutput(JSON.stringify(parsedData)) .setMimeType(ContentService.MimeType.JSON); }
- 在主连接器脚本中,通过
UrlFetchApp.fetchAll批量调用该Web App,实现并行解析:
function parseInParallel(rawResponses) { const webAppUrl = "你的独立脚本Web App部署URL"; const requests = rawResponses.map(rawText => ({ url: webAppUrl, method: "post", payload: { rawJson: rawText }, muteHttpExceptions: true })); // 批量发起请求,实现并行解析 const responses = UrlFetchApp.fetchAll(requests); return responses.map(res => JSON.parse(res.getContentText())); }
注意:控制并行请求数量,避免触发Apps Script配额限制(建议单次不超过10个)。
四、用Google Cloud Storage缓存原始响应(超大体积场景)
如果拆分缓存仍不方便,可将原始响应文本存储到Google Cloud Storage(无大小限制):
// 存储原始响应到GCS function saveToGCS(bucketName, fileName, rawText) { const bucket = StorageApp.getBucket(bucketName); const blob = bucket.createBlob(fileName); blob.setContentType('application/json'); blob.setContent(rawText); } // 从GCS读取原始响应 function getFromGCS(bucketName, fileName) { const bucket = StorageApp.getBucket(bucketName); const blob = bucket.getBlob(fileName); return blob ? blob.getContentText() : null; }
首次请求后将原始文本存入GCS,后续直接读取解析,既省API请求时间,也支持多实例并行读取分片解析。
内容的提问来源于stack exchange,提问作者TrsNium
相关产品推荐
相关产品推荐

