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

Google Apps Script中Lever API分页功能异常求助

解决Lever招聘API对接Google表格的分页与自定义字段解析问题

问题诊断

添加do...while分页循环后无数据返回,核心原因通常是:

  • 分页参数(offset/hasMore)处理逻辑错误,导致循环提前终止或未正确拉取后续页
  • customFields解析逻辑在分页循环中破坏了数据结构,或字段匹配错误
  • 日期格式化逻辑未处理空值,导致数据组装失败

修正后的完整脚本

function syncLeverRequisitions() {
  const SPREADSHEET_ID = "你的表格ID";
  const LEVER_API_KEY = "你的API密钥";
  const BASE_URL = "https://api.lever.co/v1/requisitions";
  
  const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  // 清空旧数据(保留表头)
  sheet.getDataRange().offset(1, 0).clearContent();
  
  // 基础表头 + 自定义字段表头(需与API返回的customFields键对应)
  const columnHeaders = [
    "ID", "职位名称", "状态", "创建日期", "更新日期",
    "招聘优先级", "所属部门", "招聘人数"
  ];
  
  // 写入表头
  sheet.getRange(1, 1, 1, columnHeaders.length).setValues([columnHeaders]);
  
  let allRequisitions = [];
  let offset = 0;
  const limit = 50; // API单次最大返回条数
  let hasMore = true;
  
  // 分页拉取循环
  do {
    const url = `${BASE_URL}?limit=${limit}&offset=${offset}`;
    const options = {
      headers: {
        "Authorization": `Basic ${Utilities.base64Encode(`${LEVER_API_KEY}:`)}`
      }
    };
    
    try {
      const response = UrlFetchApp.fetch(url, options);
      const data = JSON.parse(response.getContentText());
      
      // 无数据则终止循环
      if (!data.data || data.data.length === 0) {
        hasMore = false;
        break;
      }
      
      // 处理当前页数据:解析自定义字段+格式化日期
      const processedPage = data.data.map(req => {
        // 日期格式化:ISO字符串转中文可读格式
        const formatDate = (dateStr) => {
          return dateStr ? new Date(dateStr).toLocaleString("zh-CN") : "";
        };
        
        // 自定义字段映射:严格对应表头顺序
        const customFieldValues = [
          req.customFields?.["priority"]?.value || "",
          req.customFields?.["department"]?.value || "",
          req.customFields?.["headcount"]?.value || ""
        ];
        
        // 按表头顺序组装数据行
        return [
          req.id,
          req.text,
          req.state,
          formatDate(req.createdAt),
          formatDate(req.updatedAt),
          ...customFieldValues
        ];
      });
      
      allRequisitions = allRequisitions.concat(processedPage);
      offset += limit;
      hasMore = data.hasMore || false; // 以API返回的hasMore为准
      
    } catch (error) {
      console.error("数据拉取失败:", error);
      hasMore = false;
    }
    
  } while (hasMore);
  
  // 批量写入表格
  if (allRequisitions.length > 0) {
    sheet.getRange(2, 1, allRequisitions.length, columnHeaders.length).setValues(allRequisitions);
  }
}

关键修正说明

  1. 分页逻辑修复:

    • 严格依据API返回的hasMore字段判断是否继续拉取,避免手动判断出错
    • 每次循环后正确累加offset,确保后续页数据不重复、不遗漏
  2. 自定义字段解析优化:

    • 使用数组映射替代对象遍历,保证字段顺序与表头完全匹配
    • 用可选链?.处理字段不存在的情况,避免脚本崩溃
    • 统一用空字符串填充缺失字段,保证数据行结构完整
  3. 日期格式化优化:

    • 封装独立的格式化函数,统一处理空日期值,避免因null/undefined导致的错误

适配自定义字段步骤

  1. 先调用一次API(或运行无分页的测试脚本),查看customFields的返回结构,示例:
    "customFields": {
      "priority": {"value": "紧急", "type": "select"},
      "department": {"value": "技术部", "type": "text"}
    }
    
  2. 在columnHeaders数组末尾添加对应的自定义字段名称
  3. 在customFieldValues数组中,按表头顺序添加对应字段的取值逻辑:req.customFields?.["API返回的键名"]?.value || ""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:55:16