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

使用Google Apps Script从Firestore导出数据到Sheets时遇栈溢出错误

问题原因分析

栈溢出错误的核心原因是函数名冲突导致的无限递归:
你自定义的函数名为getFirestore,而FirestoreApp库中初始化Firestore实例的方法也叫getFirestore。当你在自定义函数内调用FirestoreApp.getFirestore()时,由于作用域解析问题,实际执行的是你自己写的getFirestore函数,而非库的方法,从而陷入无限循环,反复调用自身直到超出调用栈上限。

另外,你代码中的email、key、projectId均为空字符串,即使解决递归问题,后续也无法正常连接Firestore。

解决步骤

1. 解决无限递归问题

重命名自定义的初始化函数,避免和库方法名冲突:

// 重命名为initializeFirestore,避免与库方法名重复
function initializeFirestore(){
  // 填写你的Firebase服务账号邮箱、私钥、项目ID
  var email = "your-service-account@your-project.iam.gserviceaccount.com";
  var key = "-----BEGIN PRIVATE KEY-----\nYOUR_PRIVATE_KEY\n-----END PRIVATE KEY-----\n";
  var projectId = "your-firebase-project-id";

  return FirestoreApp.getFirestore(email, key, projectId);
}

然后在myFunction中修改调用:

let firestore = initializeFirestore();

2. 填写有效的Firestore认证信息

确保email、key、projectId是从Firebase控制台下载的服务账号JSON文件中提取的有效信息:

  • email:服务账号的client_email字段
  • key:服务账号的private_key字段(注意保留换行符)
  • projectId:服务账号的project_id字段

3. 优化Sheet写入性能(可选但推荐)

原代码在循环中每次调用appendRow会频繁触发Sheets API,效率低下。建议先收集所有数据,再一次性写入:

function myFunction() {
  let firestore = initializeFirestore();
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = activeSheet.getActiveSheet();

  let allDocuments = firestore.getDocuments("Doctors");
  // 先创建一个空数组存储所有行数据
  var allRows = [];

  for(var i = 0; i < allDocuments.length; i++){
    var myArray = [];
    var name = allDocuments[i].fields["name"];
    myArray.push(name ? name.stringValue : ""); // 增加空值判断避免报错
    var major = allDocuments[i].fields["major"];
    myArray.push(major ? major.stringValue : "");
    allRows.push(myArray);
  }

  // 一次性写入所有数据,从当前最后一行的下一行开始
  if(allRows.length > 0){
    sheet.getRange(sheet.getLastRow() + 1, 1, allRows.length, allRows[0].length).setValues(allRows);
  }
}
验证步骤
  1. 保存修改后的代码
  2. 重新运行myFunction
  3. 检查Sheet中是否成功导入Firestore的Doctors集合数据

内容的提问来源于stack exchange,提问作者fyry J4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:22:14