我有以下代码,我使用'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后。”错误!
所以我仍在寻找一种动态捕获列标题值的方法。
答案 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;
}
我不知道这是否是你需要的。如果没有,请在评论部分提供反馈。