Pipedrive API导Google Sheets:请求超限与脚本超时问题求助
解决方案:兼顾Pipedrive速率限制与Google Apps Script执行时长的导出脚本
针对你的问题,我们可以通过分批并行请求+精准延迟控制来平衡Pipedrive的API速率限制(2秒内最多80次请求)和Google Apps Script的30秒执行限制。核心思路是:先一次性获取所有产品ID,再将请求分成每批79个(留1个余量避免触发限制),每批用UrlFetchApp.fetchAll()并行请求,每批之间等待2秒,最后统一处理响应数据。
关键优化点
- 批量获取基础ID:一次请求拉取最多500个产品ID(Pipedrive API支持的最大limit),减少初始请求次数
- 分批并行请求:用
fetchAll()批量处理每批请求,比串行请求效率高得多,避免GAS超时 - 严格遵守速率限制:每批最多79个请求,每批之间强制等待2秒,完全符合Pipedrive的速率规则
- 高效数据处理:统一整理所有响应数据,直接输出适合Google Sheets的二维数组
完整优化脚本
function exportPipedriveDealsToSheets() { // 配置参数 const API_TOKEN = "你的Pipedrive API Token"; const BASE_URL = "https://laptop.pipedrive.com/v1"; const MAX_BATCH_SIZE = 79; // 遵循Pipedrive 2秒80次请求的限制,留1个余量 const LIMIT = 500; // Pipedrive API支持的单请求最大返回数 try { // 第一步:获取所有产品ID const productIdsUrl = `${BASE_URL}/products:(id)?start=0&limit=${LIMIT}&api_token=${API_TOKEN}`; const productResponse = UrlFetchApp.fetch(productIdsUrl); const productData = JSON.parse(productResponse.getContentText()).data; if (!productData || productData.length === 0) { Logger.log("未获取到产品数据"); return []; } // 第二步:构建所有产品详情请求URL,并分批 const allRequests = []; const batches = []; productData.forEach(product => { const dealDetailUrl = `${BASE_URL}/products/${product.id}/deals:(id,d93b458adf4bf84fefb6dbce477fe77cdf9de675)?start=0&limit=${LIMIT}&api_token=${API_TOKEN}`; allRequests.push(dealDetailUrl); // 达到批次大小就加入批次列表,重置当前请求数组 if (allRequests.length === MAX_BATCH_SIZE) { batches.push([...allRequests]); allRequests.length = 0; } }); // 处理剩余的不足一批的请求 if (allRequests.length > 0) { batches.push(allRequests); } // 第三步:分批执行请求,每批后等待2秒 const allResults = []; batches.forEach((batch, index) => { // 除了第一批,每批前等待2秒(因为第一批执行前不需要等待) if (index > 0) { Utilities.sleep(2000); } // 并行执行当前批次的所有请求 const responses = UrlFetchApp.fetchAll(batch); // 解析每个响应的数据,整理成表格格式 responses.forEach(response => { const dealData = JSON.parse(response.getContentText()).data; const productId = parseInt(response.getUrl().match(/products\/(\d+)/)[1]); if (dealData && dealData.length > 0) { dealData.forEach(deal => { allResults.push([ productId, // 产品ID deal.id, // 交易ID deal['d93b458adf4bf84fefb6dbce477fe77cdf9de675'] // 自定义字段值 ]); }); } else { // 如果该产品没有关联交易,也记录产品ID allResults.push([productId, null, null]); } }); }); // 第四步:将结果写入当前活动工作表(可选:可以指定特定工作表) const sheet = SpreadsheetApp.getActiveSheet(); // 清空现有数据(可选,根据需求调整) sheet.clearContents(); // 写入表头 sheet.getRange(1, 1, 1, 3).setValues([["产品ID", "交易ID", "自定义字段值"]]); // 写入数据 if (allResults.length > 0) { sheet.getRange(2, 1, allResults.length, 3).setValues(allResults); } Logger.log(`成功导出 ${allResults.length} 条数据`); return allResults; } catch (error) { Logger.log(`执行出错:${error.message}`); throw error; } }
脚本工作说明
- 参数配置:先填写你的Pipedrive API Token,调整
MAX_BATCH_SIZE和LIMIT参数(一般保持默认即可) - 获取产品ID:一次请求拉取最多500个产品ID,确保初始请求高效
- 分批构建请求:将产品详情请求分成每批79个,避免触发Pipedrive的速率限制
- 分批执行请求:每批用
fetchAll()并行请求,除第一批外,每批前等待2秒,严格遵守速率规则 - 数据整理与写入:统一解析所有响应,整理成包含产品ID、交易ID、自定义字段的二维数组,直接写入Google Sheets
- 错误处理:加入异常捕获,方便排查问题
额外建议
- 如果你的产品数量超过500,需要添加分页逻辑(循环获取
start参数,直到返回的data为空) - 可以将脚本设置为定时触发器(Google Apps Script的触发器功能),自动定期导出数据,避免手动执行的时长限制
- 测试时可以先减小
LIMIT参数(比如设为10),验证脚本正常工作后再恢复为500
内容的提问来源于stack exchange,提问作者allanetu
相关产品推荐
相关产品推荐

