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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:10:31