如何在Google Apps Script中循环调用多API获取多卡片评论
解决方案
核心修改思路
- 批量读取卡片ID:从电子表格的指定列中获取所有目标卡片ID(假设ID存放在A列,从A3开始,每行一个)
- 自动定位追加位置:动态找到下一个空行,避免覆盖已有的评论数据
- 循环调用API:遍历每个卡片ID,拉取对应评论并追加到表格中
- 关联评论与卡片:新增一列记录评论所属的卡片ID,便于后续区分来源
修改后的完整代码
const DATA_SHEET = "Data"; const USERNAME_CELL = "B1"; const API_TOKEN_CELL = "B2"; const CARD_IDS_START_CELL = "A3"; // 卡片ID从A3开始,每行一个 const FIRST_OUTPUT_ROW = 4; const FIRST_OUTPUT_COL = 1; var Util = {}; Util.getNextPage = function(response) { var url = response.getAllHeaders().Link; if (!url) { return ""; } return /<([^>]+)/.exec(url)[1]; }; Util.formatUrl = function(urlOrPath) { var baseUrl = "https://api.getguru.com/api/v1"; if (urlOrPath.startsWith("http")) { return urlOrPath; } if (urlOrPath.startsWith("/")) { return baseUrl + urlOrPath; } else { return baseUrl + "/" + urlOrPath; } }; Util.get = function(path, username, apiToken) { var params = { "method": "GET", "muteHttpExceptions": true, "headers": { "Content-Type": "application/json", "Authorization": "Basic " + Utilities.base64Encode(username + ":" + apiToken), "x-guru-application": "spreadsheet", "X-Amzn-Trace-Id": "GApp=spreadsheet" } }; var response = UrlFetchApp.fetch(Util.formatUrl(path), params); var data = JSON.parse(response.getContentText()); var nextPage = Util.getNextPage(response); if (nextPage) { data.nextPage = nextPage; }; return data; }; Util.getAll = function(url, username, apiToken, callback) { var data = []; while (url) { var page = Util.get(url, username, apiToken); var startIndex = data.length; page.forEach(function(a) { data.push(a); }); url = page.nextPage; if (callback) { callback(data, startIndex, page.length, url ? false : true); } } return data; }; function getComments() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(DATA_SHEET); var username = sheet.getRange(USERNAME_CELL).getValue(); var apiToken = sheet.getRange(API_TOKEN_CELL).getValue(); // 获取所有卡片ID:从A3开始到A列最后一个非空行,过滤空值 var cardIdsRange = sheet.getRange(CARD_IDS_START_CELL + ":" + sheet.getRange(CARD_IDS_START_CELL).getColumn()); var cardIds = cardIdsRange.getValues().flat().filter(id => id !== ""); // 确定评论的起始写入行(下一个空行) var lastOutputRow = sheet.getRange(FIRST_OUTPUT_COL + ":" + FIRST_OUTPUT_COL).getValues().filter(row => row[0] !== "").length; var currentOutputRow = lastOutputRow > 0 ? lastOutputRow + 1 : FIRST_OUTPUT_ROW; // 遍历每个卡片ID拉取评论并写入 cardIds.forEach(function(cardId) { if (!cardId) return; var pathUrl = "/cards/" + cardId + "/comments"; var results = Util.getAll(pathUrl, username, apiToken); results.forEach(function(comment) { sheet.getRange(currentOutputRow, FIRST_OUTPUT_COL).setValue(comment.dateCreated); sheet.getRange(currentOutputRow, FIRST_OUTPUT_COL + 1).setValue(comment.content); sheet.getRange(currentOutputRow, FIRST_OUTPUT_COL + 2).setValue(cardId); // 新增卡片ID关联列 currentOutputRow++; }); }); }
关键修改说明
- 批量ID读取:通过
getRange获取A列所有非空单元格,用filter去除空值,确保只处理有效ID - 动态追加位置:计算已有数据的行数,自动定位下一个空行,避免重复运行时覆盖数据
- 卡片ID关联:在评论内容右侧新增一列记录卡片ID,方便后续追溯评论来源
- 循环处理逻辑:用
forEach遍历所有卡片ID,依次调用API拉取评论并写入表格
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

