使用google Apps脚本将google sheets数据保存到Firebase

使用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

我正在尝试将我的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>

有一个与Firebase的REST API集成的应用程序。如果您对使用它感到满意,这将变得非常简单

首先,我们需要创建一个选项卡来跟踪更改。我们需要更改者的身份,因此我们必须将其分为两部分-一个简单的
onEdit
触发器,作为修改用户运行,一个可安装的触发器,我将其称为
uploadChanges
。后者是与Firebase对话的内容

  • 创建一个名为
    changes
  • 添加具有以下标题的冻结行:
    • 上传
    • 使用者
    • 价值观
  • 首先单击脚本编辑器中的Resources>Libraries,然后在“查找库”框中粘贴
    myep8zeet1ylvdxs7uig9pldocoke7-2l
    。点击保存
  • 通过选择最新的公开发行版来选择稳定性,或者选择最新的发行版(我在撰写本文时选择了最新版本)
  • 单击确定
  • 现在是仔细阅读的好时机,这样您就知道我在下面的说明中要做什么:-)
  • 设置(我假设您希望此脚本按自己的方式运行)

  • 让您的Google帐户(运行脚本)至少成为Firebase项目的编辑器
  • 为您的应用程序脚本项目设置适当的脚本:
  • 转到应用程序脚本编辑器中的文件>项目属性>范围
  • 选择查看显示清单文件(默认情况下清单文件通常是隐藏的)
  • 添加
    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查看文件推送通知