修正App Script调用GA4 API分页逻辑,突破每日1万行限制
解决GA4 API分页拉取全量数据及按日循环问题
首先明确:GA4的RunReport API没有pageSize参数,你之前报错是因为用错了字段——控制每页数据量的是limit(最大值10000),配合pageToken实现分页。下面是修正后的完整代码,实现按日循环+单日内全量拉取:
function fetchGA4DailyData() { // 配置参数:替换为你的GA4属性ID、起始/结束日期 const propertyId = 'YOUR_GA4_PROPERTY_ID'; const startDate = new Date('2024-01-01'); // 起始日期 const endDate = new Date('2024-01-07'); // 结束日期 // GA4请求的固定维度/指标(可根据需求修改) const dimensions = [ {name: 'date'}, {name: 'userCountry'}, {name: 'sessionSourceMedium'} ]; const metrics = [ {name: 'activeUsers'}, {name: 'sessions'} ]; // 按日期循环处理 let currentDate = new Date(startDate); while (currentDate <= endDate) { const formattedDate = Utilities.formatDate(currentDate, 'UTC', 'yyyy-MM-dd'); console.log(`开始拉取日期:${formattedDate}`); let allRows = []; let pageToken = null; let hasMoreData = true; // 单日内分页拉取 while (hasMoreData) { try { const requestBody = { dateRanges: [{startDate: formattedDate, endDate: formattedDate}], dimensions: dimensions, metrics: metrics, limit: 10000, // 每页最大10000条,GA4的上限 pageToken: pageToken // 第一次请求为null,后续用返回的nextPageToken }; // 调用GA4 API const response = AnalyticsData.Properties.runReport( requestBody, `properties/${propertyId}` ); // 合并当前页数据 if (response.rows) { allRows = allRows.concat(response.rows); } // 检查是否有下一页 pageToken = response.nextPageToken; hasMoreData = pageToken !== undefined && pageToken !== null; console.log(`当前页拉取完成,累计数据量:${allRows.length}`); } catch (e) { console.error(`拉取日期${formattedDate}时出错:${e.message}`); hasMoreData = false; } } // 处理当日全量数据(比如写入Sheet,这里示例打印到日志) if (allRows.length > 0) { console.log(`日期${formattedDate}全量数据拉取完成,共${allRows.length}条`); // 这里可以添加写入Google Sheet的逻辑,比如: // writeDataToSheet(formattedDate, allRows, dimensions, metrics); } else { console.log(`日期${formattedDate}无数据`); } // 切换到下一天 currentDate.setDate(currentDate.getDate() + 1); } } // 可选:将数据写入Google Sheet的辅助函数 function writeDataToSheet(date, rows, dimensions, metrics) { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('GA4数据'); if (!sheet) return; // 写入表头 const header = dimensions.map(d => d.name).concat(metrics.map(m => m.name)); sheet.appendRow(['日期'].concat(header)); // 写入数据行 rows.forEach(row => { const dimensionValues = row.dimensionValues.map(v => v.value); const metricValues = row.metricValues.map(v => v.value); sheet.appendRow([date].concat(dimensionValues).concat(metricValues)); }); }
关键说明:
- 分页参数修正:用
limit:10000代替pageSize,每次请求传递pageToken,直到返回的nextPageToken为空,说明当日数据已拉取完毕。 - 日期循环逻辑:通过
currentDate.setDate(currentDate.getDate() + 1)逐天切换,确保每天的数据拉取完成后再进入下一天。 - 数据合并:用
allRows.concat(response.rows)累加每页数据,避免丢失。 - 错误处理:捕获API调用异常,避免单个日期的错误中断整个循环。
注意事项:
- 确保你的App Script已启用GA4 Analytics Data API,并且授权正确。
- GA4 API有每日调用配额限制,若数据量极大,可添加
Utilities.sleep(1000)避免触发频率限制。 - 维度和指标可根据业务需求自行修改,注意GA4的维度指标组合规则。
内容的提问来源于stack exchange,提问作者Herman K
相关产品推荐
相关产品推荐

