使用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); } }
验证步骤
- 保存修改后的代码
- 重新运行
myFunction - 检查Sheet中是否成功导入Firestore的
Doctors集合数据
内容的提问来源于stack exchange,提问作者fyry J4
相关产品推荐
相关产品推荐

