Shopify订单API分页异常:仅拉取250条订单的排查求助
问题排查与修复方案
核心问题分析
你的脚本无法获取后续分页数据,主要由以下几个原因导致:
1. HTTP Header键名大小写不匹配
Google Apps Script中UrlFetchApp.getHeaders()返回的头信息键名大小写敏感,Shopify API返回的分页链接头是Link(首字母大写),但你的代码中用了小写的["link"],导致无法正确读取分页头:
// 错误写法 var link_header = response.getHeaders()["link"];
2. 正则表达式匹配不健壮
你的正则/<(.*)>; rel="next"/未考虑HTTP头中可能存在的空格差异(比如; rel="next"前可能有多个空格),且未处理匹配失败的情况,一旦匹配不到就会抛出错误终止循环。
3. 空表时执行sheet.clear()会报错
在判断工作表是否存在之前,你先执行了sheet.clear(),如果首次运行时OrdersTEST表不存在,sheet为null,这行代码会直接报错,导致脚本提前终止。
修复后的完整代码
// Import the required modules const sheetName = "OrdersTEST"; let newSheet = SpreadsheetApp.getActive().getSheetByName(sheetName); // Define the API endpoint and headers const endpoint = "https://STOREID.myshopify.com/admin/api/2024-01/orders.json?status=any&limit=250&fields=order_number,id,email,created_at,total_price,current_total_price,financial_status,line_items,tax_lines,gateway, shipping_address,shipping_lines,note_attributes&order=created_at asc"; const apiKeyHeader = {"X-Shopify-Access-Token": "ACCESS_TOKEN"}; // Define the delay time to avoid hitting rate limit const delayTime = 1500; function getOrders() { // Create sheet if not exists if (!newSheet) { newSheet = SpreadsheetApp.getActive().insertSheet(sheetName); } // Clear the sheet (only after confirming sheet exists) newSheet.clear(); // Add column titles newSheet.appendRow(["Order ID", "Email", "Created At", "Total Price"]); // Initial call to API to get first page of orders let response = UrlFetchApp.fetch(endpoint, {headers: apiKeyHeader}); let data = JSON.parse(response.getContentText()); // Write first page data writeOrdersToSheet(data.orders); // Get next page URL (use correct case for header key) let linkHeader = response.getHeaders()["Link"]; Logger.log("Link Header: " + linkHeader); // Loop through all pages of orders while (linkHeader) { Utilities.sleep(delayTime); // Robust regex to match next page URL const nextLinkMatch = linkHeader.match(/<([^>]+)>;\s*rel="next"/); if (!nextLinkMatch) { Logger.log("No next page found, exiting loop"); break; } const nextLink = nextLinkMatch[1]; Logger.log("Next Page URL: " + nextLink); response = UrlFetchApp.fetch(nextLink, {headers: apiKeyHeader}); data = JSON.parse(response.getContentText()); // Write current page data writeOrdersToSheet(data.orders); // Update link header for next iteration linkHeader = response.getHeaders()["Link"]; Logger.log("Updated Link Header: " + linkHeader); } Logger.log("Orders data written to sheet successfully!"); } // Helper function to write orders to sheet (reduces code duplication) function writeOrdersToSheet(orders) { const values = orders.map(order => [ order.id, order.email, order.created_at, order.total_price ]); if (values.length === 0) return; const nextRow = newSheet.getLastRow() + 1; newSheet.getRange(nextRow, 1, values.length, values[0].length).setValues(values); }
关键修复点说明
- Header键名修正:将
response.getHeaders()["link"]改为response.getHeaders()["Link"],匹配Shopify返回的头信息键名。 - 健壮的正则匹配:更新正则为
/<([^>]+)>;\s*rel="next"/,支持分号后任意空格,且用[^>]+精准匹配URL(避免贪婪匹配)。同时增加匹配失败判断,防止脚本崩溃。 - 工作表操作顺序调整:先判断并创建工作表,再执行
clear()操作,避免空表报错。 - 代码复用优化:提取
writeOrdersToSheet辅助函数,减少重复代码,提升可读性。 - API版本更新:将API版本从2021-10升级到2024-01(最新稳定版),避免旧版本的兼容性问题。
- 延迟时间调整:将延迟从1000ms改为1500ms,降低触发Shopify速率限制的风险。
内容的提问来源于stack exchange,提问作者Darrylh
相关产品推荐
相关产品推荐

