【问题标题】:Google App Script - Using column headers as name in JSON key/value pairGoogle App Script - 在 JSON 键/值对中使用列标题作为名称
【发布时间】:2016-01-12 01:30:57
【问题描述】:

我有以下代码,我将其与“FireBaseApp 库资源”一起使用来更新 FireBase。

function writeDataToFirebase() {
      var ss = SpreadsheetApp.openById(".......mySheetRef.........");
      var sheet = ss.getSheets()[0];
      var data = sheet.getDataRange().getValues();


      var dataToImport = {};
      for(var i = 1; i < data.length; i++) {
        var EventName = data[i][0];
        var Description = data[i][1];

        dataToImport[EventName] = {
          EventName:EventName,
          Description:Description,
          EmailAddress:data[i][2],
          who:data[i][4],
          client:data[i][5],
          partners:data[i][6],
          EventDate:data[i][7]
        };
      }
      var firebaseUrl = "https://myFireBase.firebaseio.com/";
      var secret = "secret_here";
      var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);
      base.setData("", dataToImport);

    }

一切正常,除了...

为了增加项目的可扩展性,我想动态地从第 1 行列标题中添加键“名称”。因此,如果列名更改或添加了更多列,则无需每次都重新编写脚本。

所以,而不是硬编码...

EmailAddress:data[i][2],
I would like
"row 1 column header value":data[i][2],

我似乎无法做到这一点:-(

非常感谢任何帮助。

更新: 我已经尝试添加....

    -> var Headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
 Logger.log(Headers);

  var dataToImport = {};

for(var i = 1; i < data.length; i++) {
  var EventName = data[i][0];
  var Description = data[i][1];

  dataToImport[EventName] = {
    EventName:EventName,
    Description:Description,
  -> Headers[2]:data[i][2],
    who:data[i][4],
    client:data[i][5],
    partners:data[i][6],
    EventDate:data[i][7]
  };
}

但这会产生一个“缺少:属性 ID 之后。”错误!

所以我仍在寻找一种动态捕获列标题值的方法。

【问题讨论】:

    标签: json google-apps-script google-sheets firebase


    【解决方案1】:

    对于任何列配置,以下代码可能对您和我一样适用。您需要分配 uniquecolumn 标题(在下面的示例中是唯一的)

    var sheetsid = "your-google-sheet-id-here";
    var fbpath = "https://your-app-here.firebaseio.com/fromsheet";
    var fbsecret = "your-secret-here";
    function sheet2FB() {
      var sheetname = "Data";
      var sheet = SpreadsheetApp.openById(sheetsid).getSheetByName(sheetname);
      var uniquecolumn = "unique";
      var objectsarray = xsLibSheets.getRows(sheet);
      var fbready = objectsarray.reduce(function(p,v){ p[v[uniquecolumn]] = v; return p; }, {});
      var fb = FirebaseApp.getDatabaseByUrl(fbpath, fbsecret);
      fb.setData("", fbready);
      Logger.log(JSON.stringify(fbready,null,2));
      return;
    }
    

    函数 getRows() 使用标题作为键从工作表中获取数据作为 json 对象数组。 可以找到库代码on this link

    【讨论】:

    • 太棒了!谢谢@Fausto。这正是我需要的方式。
    【解决方案2】:

    代码有一个新变量row1_Col2_HdrVal,它总是从索引零获取数据,这将是第一行,如果你得到getDataRange()的范围。

    var dataToImport = {},
        row1_Col2_HdrVal = data[0][2],
        innerObject = {};
    
    for(var i = 1; i < data.length; i++) {
      var innerKeyName = data[i][0];
    
      var j=0;
      for (j=0;j<length;j+=1) {
        innerObject[innerKeyName] = data[i][j];
      };
    
      dataToImport[EventName] = innerObject;
    }
    

    我不知道这是否是您需要的。如果没有,请在评论部分提供反馈。

    【讨论】:

    • 感谢@sandy-good 的建议。
      我曾尝试过这样的事情,但代码只是写出“row1_Col2_HdrVal”作为键名而不是变量的内容!我还需要它才能捕获第 1 行中的所有标题,而不仅仅是单元格 [0][2] 中的值。
    • 好的。我认为您需要一个内部循环,然后将内部对象放入外部对象中。我更改了代码。代码可能完全没用,但也许它会给你一个想法。
    • 干杯桑迪,我会根据你的建议玩一玩。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多