Google App脚本 - 在JSON键/值对

时间:2016-01-12 01:30:57

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

我有以下代码,我使用'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行列标题中添加Key“Name”。因此,如果列名称更改或添加了更多列,则每次都不需要重新编写脚本。

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

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后。”错误!

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

代码有一个新变量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;
}

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