【问题标题】:How to send hierarchical data from firebase to google sheet如何将分层数据从 Firebase 发送到 Google 工作表
【发布时间】:2019-05-28 07:07:17
【问题描述】:

下面是我在 firebase 数据库中的数据层次结构。我想将此数据发送到谷歌表,但我无法这样做。

谷歌表声明的错误是“TypeError:无法从未定义中读取属性“rytf1JLXetTIINjHNku0yAvs7su2”。 详情”

下面是我试图检索数据的代码。请让我知道错误。谢谢!

function writeSheets() {
    var ss = SpreadsheetApp.openById("google-sheet-id");
    var firebaseUrl = "database-url";
    var base = FirebaseApp.getDatabaseByUrl(firebaseUrl);
    var data = base.getData('users/admin');

    Logger.log(data);
    var num = 2;
    range = ss.getRange("A" + num + ":E" + num + "");
    for (var i in data) {
        var values = [
            [
                [
                    [data][data][i] // Error occurs here 
                ].email, [
                    [data][data][i] // Error occurs here 
                ].userName, [
                    [data][data] // Error occurs here 
                    [i]
                ].Password, [
                    [data][data][i]  // Error occurs here 
                ].loginState, [
                    [data][data][i]  // Error occurs here 
                ].uid
            ]
        ];
        range.setValues(values);
        num += 1;
        range = ss.getRange("A" + num + ":E" + num + "");
    }

}

数据样本值

{
   rytf1JLXetTIINjHNku0yAvs7su2:
      {
        loginDetail: 
            {
              uid:rytf1JLXetTIINjHNku0yAvs7su2,
              password:123456,
              loginState:true, 
              userName:John,
              email:a@a.com
        }
      }
    }

【问题讨论】:

  • 为了正确理解你的情况,你能提供一个data的样本值来复制错误吗?当然,请删除您的个人信息。
  • 我已经用样本数据@Tanaike 更新了问题
  • 感谢您更新它。作为另一个问题,我可以问你发生错误的脚本行吗?
  • 是的,当我通过编写 [data][data] @Tanaike 在对象中调用对象时,循环变量值中会发生错误
  • 错误出现在range.setValues(values)吗?

标签: firebase-realtime-database google-apps-script


【解决方案1】:

从你的问题和cmets,我认为你想做如下。

  • 您希望将"email", "userName", "password", "loginState", "uid" 的值每行都放入电子表格中。
  • 您想将第一张工作表第二行的值放入电子表格中。
  • 对象data的结构如下。您想从对象loginDetail 中检索每个值。

    {
      "rytf1JLXetTIINjHNku0yAvs7su2": {
        "loginDetail": {
          "uid": "rytf1JLXetTIINjHNku0yAvs7su2",
          "password": 123456,
          "loginState": true,
          "userName": "John",
          "email": "a@a.com"
        }
      }
    };
    

如果我的理解是正确的,那么这个修改呢?

修改点:

  • 在第2层找到loginDetail,检索到loginDetail的对象。
  • 从检索到的对象loginDetail中,依次检索"email", "userName", "password", "loginState", "uid"的每个值。
  • "email", "userName", "password", "loginState", "uid" 的值来自电子表格第一张表的第二行。

修改后的脚本:

function writeSheets() {
  var ss = SpreadsheetApp.openById("google-sheet-id");
  var firebaseUrl = "database-url";
  var base = FirebaseApp.getDatabaseByUrl(firebaseUrl);
  var data = base.getData('users/admin');

  Logger.log(data);

  // I modified below script.
  var keys = ["email", "userName", "password", "loginState", "uid"];
  var res = [];
  for (var i in data) {
    for (var j in data[i]) {
      if (j == "loginDetail") {
        res.push(keys.map(function(e) {return data[i][j][e]}));
      }
    }
  }
  var num = 2;
  ss.getRange("A" + num + ":E" + (res.length + num - 1)).setValues(res);
}

注意:

  • 如果对象data的结构发生变化,需要遍历对象。到时候请告诉我。

参考:

【讨论】:

  • @Ghulam Ahmed 欢迎您。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多