是否可以使用节点为字符串而不是整数的 Firebase 实时数据库更新 google 工作表?

问题描述 投票:0回答:1

我正在使用一个非常基本的 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 google-sheets firebase-realtime-database
1个回答
0
投票

您一直依赖的是 Firebase 实时数据库数组强制逻辑,它适用于以下情况:

  • 所有键都可以解析为数字
  • 第一个键是足够低的数字
  • 所有按键都彼此靠近(即您可以跳过一些数字,但不能跳过很多)

当您添加非数字键时,您违反了第一个要求,因此 Firebase 将停止将数据强制到数组,而是返回对象中子属性的实际键。


您要么必须删除非数字键,以便现有代码再次工作,要么更新代码以使用您现在返回的非数组/对象结构。

实现后者的一种方法是迭代 Object.entries():

for (const [key, value] of Object.entries(dataSet)) {
  rows.push([key, value]);
}
© www.soinside.com 2019 - 2024. All rights reserved.