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

如何在Google Apps Script中循环调用多API获取多卡片评论

解决方案

核心修改思路

  1. 批量读取卡片ID:从电子表格的指定列中获取所有目标卡片ID(假设ID存放在A列,从A3开始,每行一个)
  2. 自动定位追加位置:动态找到下一个空行,避免覆盖已有的评论数据
  3. 循环调用API:遍历每个卡片ID,拉取对应评论并追加到表格中
  4. 关联评论与卡片:新增一列记录评论所属的卡片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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:41:06