我试图将我的Google工作表与我的firebase数据库同步。我对javaScript不是很有经验,所以可以使用下面的方法吗?这个想法是每次创建/更新/删除新行时它都会自动同步。我知道我需要脚本文件,但不知道如何在.gs文件中导入它们,这就是它在html中的原因。 非常感谢!
translate.gs
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>
答案 0 :(得分:1)
有一个third-party libarary与Firebase的REST API集成。如果你习惯使用它,这就变得非常简单了。
首先,我们需要创建一个标签来跟踪更改。我们需要进行更改的人的身份,因此我们必须将其分为两部分 - 一个简单的onEdit
触发器作为修改用户运行,一个可安装的触发器,我将调用{{1} }。后者与Firebase谈判。
uploadChanges
Install the third party Firebase library
changes
。框。点击保存。设置security(我假设你希望这个脚本像你一样运行)
MYeP8ZEEt1ylVDxS7uyg9plDOcoke7-2l
和https://www.googleapis.com/auth/userinfo.email
添加到https://www.googleapis.com/auth/firebase.database
数组中(如果它尚未添加则添加)相当于您上面的oauthScopes
,它总是将您的食物设置为“披萨真菌”,如下所示:
translate.gs
但是你说你想在每次保存时更新Firebase。要做到这一点,你真的只想撕掉网上漂浮的各种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);
}
tutorials之一。生成的onEdit
应如下所示:
onEdit
最后,设置一些触发器。
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
onEdit
From spreadsheet
On edit
添加新触发器
uploadChanges
uploadChanges
编辑:我原来的脚本让你在Time-driven
中做了所有事情,tehhowch正确地指出,因为我们正在与另一项服务交谈,所以不会工作。我已更新,以便进入&#34;更改&#34;我在设置中包含的标签。我的新方法保留了旧上传的永久记录;为了提高性能,您可以选择在完成上传后清除onEdit
表单。