使用google Apps脚本将google sheets数据保存到Firebase
我正在尝试将我的google工作表与我的firebase数据库同步。我对javaScript不是很有经验,所以可以使用下面的方法吗?其思想是,每次创建/更新/删除新行时,它都会自动同步。我知道我需要脚本文件,但不确定如何将它们导入到.gs文件中,因此它位于html中。 非常感谢 translate.gs使用google Apps脚本将google sheets数据保存到Firebase,firebase,firebase-realtime-database,google-apps-script,Firebase,Firebase Realtime Database,Google Apps Script,我正在尝试将我的google工作表与我的firebase数据库同步。我对javaScript不是很有经验,所以可以使用下面的方法吗?其思想是,每次创建/更新/删除新行时,它都会自动同步。我知道我需要脚本文件,但不确定如何将它们导入到.gs文件中,因此它位于html中。 非常感谢 translate.gs function saveToFirebase() { var config = { apiKey: "MY_API_KEY", authDomain: "MY_DOMA
function saveToFirebase() {
var config = {
apiKey: "MY_API_KEY",
authDomain: "MY_DOMAIN.firebaseapp.com",
databaseURL: "MY_DOMAIN.firebaseio.com",
projectId: "MY_DOMAIN",
storageBucket: "MY_DOMAIN.appspot.com",
messagingSenderId: "MESSAGE_ID"
};
firebase.initializeApp(config);
var database = firebase.database();
database.ref('food/' + MY_USER_UID).set({
name: "pizza funghi",
});
}
sidebar.html
<!DOCTYPE html>
<html>
<head>
<script src="https://www.gstatic.com/firebasejs/4.12.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.12.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.12.0/firebase-database.js"></script>
</head>
<body>
</body>
</html>
有一个与Firebase的REST API集成的应用程序。如果您对使用它感到满意,这将变得非常简单
首先,我们需要创建一个选项卡来跟踪更改。我们需要更改者的身份,因此我们必须将其分为两部分-一个简单的onEdit
触发器,作为修改用户运行,一个可安装的触发器,我将其称为uploadChanges
。后者是与Firebase对话的内容
changes
- 上传
- 使用者
- 价值观
myep8zeet1ylvdxs7uig9pldocoke7-2l
。点击保存https://www.googleapis.com/auth/userinfo.email
和https://www.googleapis.com/auth/firebase.database
到oauthScopes
数组中(如果还没有添加它)translate.gs
,它总是将食物设置为“pizza funghi”,如下所示:
function saveToFirebase() {
var dbUrl = "MY_DOMAIN.firebaseapp.com"; // Set appropriately
var token = ScriptApp.getOAuthToken(); // Depends on security setup above
var firebase = FirebaseApp.getDatabaseByUrl(dbUrl, token);
newData = {
name: "pizza funghi",
};
firebase.setData('food/' + MY_USER_UID, newData);
}
function onEdit(e) {
// First get stuff about the edit.
// This approach only gets the top left cell of a multi-cell edit.
var editRange = e.range; // The edited range
var newValue = editRange.getValue();
// Next, who is the editor? Remove the `split` for full email.
var username = Session.getActiveUser().getEmail().split('@')[0];
if (username == '') {
username = SOME_REASONABLE_DEFAULT; // Or give up if you wish
}
// Finally save the change
SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('changes')
.appendRow([false, username, newValue]);
}
function uploadChanges() {
// Attach to Firebase
var dbUrl = "MY_DOMAIN.firebaseapp.com"; // Set appropriately
var token = ScriptApp.getOAuthToken(); // Depends on security setup above
var firebase = FirebaseApp.getDatabaseByUrl(dbUrl, token);
// Get content of changes tab
var changeSheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('changes');
var changeData = changeSheet.getDataRange()
.getValues();
// Upload all new-to-us changes
for (var i = 1; i < changeData.length; i++) {
if (changeData[i][0]) {
continue; // We already uploaded this one
}
changeData[i][0] = true; // Optimistically assume we'll succeed
var newData = {
name: changeData[i][2]
};
var username = changeData[i][1];
firebase.setData('food/' + username, newData);
}
// Blanket update of change-data sheet to update upload status
changeSheet.getRange(1, 1, changeData.length, changeData[0].length)
.setValues(changeData);
}
但你说过每次保存都要更新Firebase。要做到这一点,你真的只想从网络上的各种onEdit
中抽取一个。生成的onEdit
应该如下所示:
function saveToFirebase() {
var dbUrl = "MY_DOMAIN.firebaseapp.com"; // Set appropriately
var token = ScriptApp.getOAuthToken(); // Depends on security setup above
var firebase = FirebaseApp.getDatabaseByUrl(dbUrl, token);
newData = {
name: "pizza funghi",
};
firebase.setData('food/' + MY_USER_UID, newData);
}
function onEdit(e) {
// First get stuff about the edit.
// This approach only gets the top left cell of a multi-cell edit.
var editRange = e.range; // The edited range
var newValue = editRange.getValue();
// Next, who is the editor? Remove the `split` for full email.
var username = Session.getActiveUser().getEmail().split('@')[0];
if (username == '') {
username = SOME_REASONABLE_DEFAULT; // Or give up if you wish
}
// Finally save the change
SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('changes')
.appendRow([false, username, newValue]);
}
function uploadChanges() {
// Attach to Firebase
var dbUrl = "MY_DOMAIN.firebaseapp.com"; // Set appropriately
var token = ScriptApp.getOAuthToken(); // Depends on security setup above
var firebase = FirebaseApp.getDatabaseByUrl(dbUrl, token);
// Get content of changes tab
var changeSheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('changes');
var changeData = changeSheet.getDataRange()
.getValues();
// Upload all new-to-us changes
for (var i = 1; i < changeData.length; i++) {
if (changeData[i][0]) {
continue; // We already uploaded this one
}
changeData[i][0] = true; // Optimistically assume we'll succeed
var newData = {
name: changeData[i][2]
};
var username = changeData[i][1];
firebase.setData('food/' + username, newData);
}
// Blanket update of change-data sheet to update upload status
changeSheet.getRange(1, 1, changeData.length, changeData[0].length)
.setValues(changeData);
}
函数onEdit(e){
//首先获取有关编辑的信息。
//此方法仅获取多单元格编辑的左上角单元格。
var editRange=e.range;//编辑的范围
var newValue=editRange.getValue();
//接下来,谁是编辑?删除完整电子邮件的“拆分”。
var username=Session.getActiveUser().getEmail().split('@')[0];
如果(用户名=“”){
username=SOME\u reasonal\u DEFAULT;//如果愿意,可以放弃
}
//最后保存更改
SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('changes')
.appendRow([false,username,newValue]);
}
函数uploadChanges(){
//连接到火基上
var dbUrl=“MY_DOMAIN.firebaseapp.com”;//适当设置
var token=ScriptApp.getOAuthToken();//取决于上面的安全设置
var firebase=FirebaseApp.getDatabaseByUrl(dbUrl,令牌);
//“获取更改内容”选项卡
var changeSheet=SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName(“更改”);
var changeData=changeSheet.getDataRange()
.getValues();
//将所有新更改上载到我们
对于(变量i=1;i
最后,设置一些触发器
onEdit添加新触发器
- 从最左边的“运行”下拉列表中选择“编辑”
- 在事件下拉列表中,从电子表格
中选择
- 从最左边的运行下拉列表中选择上传更改
- 从运行下拉列表中选择
时间驱动
- 制定一个适合你需要的时间表
编辑:我的原始脚本让您在
onEdit
中完成所有操作,tehhowch正确地指出,由于我们正在与另一个服务进行对话,因此该脚本将不起作用。我已经更新到一个“更改”选项卡,该选项卡包含在设置中。我的新方法保持了旧上传的永久记录;为了提高性能,您可以选择在完成上传后只清除更改
工作表。您在translate.gs中编写的代码是否正常工作?这应该有助于您开始从应用程序脚本中读取和写入数据到firebase:一旦您有了这些数据,您就可以使用触发器进行同步您的工作表和数据库使用轮询…或者如果您真的喜欢冒险,请使用Driv查看文件推送通知