我正在使用一个非常基本的 gs 脚本和两个 for 循环,用存储在 firebase 实时数据库中的数据填充 google 工作表。我知道这个脚本既简单又薄弱,我可以绘制一些东西。 这是脚本(谷歌结果的第一页):
function getAllData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var sheet = ss.getActiveSheet();
var firebaseUrl = "insert_the_firebase_url_here";
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl);
var dataSet = [base.getData()];
// the following lines will depend on the structure of your data
var rows = [],
data;
for (i = 0; i < dataSet.length; i++) {
data = dataSet[i];
rows.push([data.id, data.name]);
}
dataRange = sheet.getRange(1, 1, rows.length, 2);
dataRange.setValues(rows);
}
尽管很简单,但它确实适合我正在做的事情。直到我决定用 SKU 重命名父节点,而不是隐式序列 0,1,2,3,...
当数据库以这种方式构建时:
Firebase 创建了这样的结构:
[
{
"batch": "batch1",
"id": "id1",
"name": "name1"
},
{
"batch": "batch2",
"id": "id2",
"name": "name2"
},
{
"batch": "batch3",
"id": "id3",
"name": "name3"
}
]
现在,如果我选择添加一个被命名的节点(键现在是一个字符串),如下所示:
这是 firebase 默认生成的树:
{
"0": {
"batch": "batch1",
"id": "id1",
"name": "name1"
},
"1": {
"batch": "batch2",
"id": "id2",
"name": "name2"
},
"2": {
"batch": "batch3",
"id": "id3",
"name": "name3"
},
"bob": {
"batch": "batchbob",
"id": "idbob",
"name": "namebob"
}
}
注意,我不再有方括号
[]
,但大括号中的一些数组{}
包含我的函数的项目
FirebaseApp.getDatabaseByUrl(firebaseUrl).getData()
无法迭代,因此我的 rows.length 为零,并且我的列表“行”为空。
是否有我可以做的调整或可以使用带有参数的不同函数来代替 getData()
,这将使我能够继续使用这两个循环脚本?
与 java 不同,firebase 文档有关 googleApps 脚本的信息有限,而且我完全不熟悉 .gs 的基本内部工作原理。我尝试改变定义变量的方式并使用其他函数,例如带参数的
getAllData()
,但没有太大希望,到目前为止我还没有取得任何成功。
您一直依赖的是 Firebase 实时数据库数组强制逻辑,它适用于以下情况:
当您添加非数字键时,您违反了第一个要求,因此 Firebase 将停止将数据强制到数组,而是返回对象中子属性的实际键。
您要么必须删除非数字键,以便现有代码再次工作,要么更新代码以使用您现在返回的非数组/对象结构。
实现后者的一种方法是迭代 Object.entries():
for (const [key, value] of Object.entries(dataSet)) {
rows.push([key, value]);
}