You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
  }
}

脚本工作说明

  1. 参数配置:先填写你的Pipedrive API Token,调整MAX_BATCH_SIZE和LIMIT参数(一般保持默认即可)
  2. 获取产品ID:一次请求拉取最多500个产品ID,确保初始请求高效
  3. 分批构建请求:将产品详情请求分成每批79个,避免触发Pipedrive的速率限制
  4. 分批执行请求:每批用fetchAll()并行请求,除第一批外,每批前等待2秒,严格遵守速率规则
  5. 数据整理与写入:统一解析所有响应,整理成包含产品ID、交易ID、自定义字段的二维数组,直接写入Google Sheets
  6. 错误处理:加入异常捕获,方便排查问题

额外建议

  • 如果你的产品数量超过500,需要添加分页逻辑(循环获取start参数,直到返回的data为空)
  • 可以将脚本设置为定时触发器(Google Apps Script的触发器功能),自动定期导出数据,避免手动执行的时长限制
  • 测试时可以先减小LIMIT参数(比如设为10),验证脚本正常工作后再恢复为500

内容的提问来源于stack exchange,提问作者allanetu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:37:42