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); } }
关键修正说明
分页逻辑修复:
- 严格依据API返回的
hasMore字段判断是否继续拉取,避免手动判断出错 - 每次循环后正确累加
offset,确保后续页数据不重复、不遗漏
- 严格依据API返回的
自定义字段解析优化:
- 使用数组映射替代对象遍历,保证字段顺序与表头完全匹配
- 用可选链
?.处理字段不存在的情况,避免脚本崩溃 - 统一用空字符串填充缺失字段,保证数据行结构完整
日期格式化优化:
- 封装独立的格式化函数,统一处理空日期值,避免因
null/undefined导致的错误
- 封装独立的格式化函数,统一处理空日期值,避免因
适配自定义字段步骤
- 先调用一次API(或运行无分页的测试脚本),查看
customFields的返回结构,示例:"customFields": { "priority": {"value": "紧急", "type": "select"}, "department": {"value": "技术部", "type": "text"} } - 在
columnHeaders数组末尾添加对应的自定义字段名称 - 在
customFieldValues数组中,按表头顺序添加对应字段的取值逻辑:req.customFields?.["API返回的键名"]?.value || ""
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

