firebase - 从Google Sheets脚本重新排列Firebase实时数据库中显示的值

标签 firebase firebase-realtime-database google-apps-script google-sheets google-sheets-api

我想更改我的值在 Firebase 实时数据库中的显示方式。它们显示为数字,我希望显示列的标题。

脚本文本:

var secret = 'xxxx'


function getFirebaseUrl(jsonPath) {

  /*
  We then make a URL builder
  This takes in a path, and
  returns a URL that updates the data in that path
  */

  return (

    'https://no-excusas.firebaseio.com/' +

    jsonPath +
    '.json?auth=' +
    secret
  )
}

function syncMasterSheet(excelData) {

  /*
  We make a PUT (update) request,
  and send a JSON payload
  More info on the REST API here : https://firebase.google.com/docs/database/rest/start
  */

  var options = {

    method: 'put',
    contentType: 'application/json',
    payload: JSON.stringify(excelData)
  }

  var fireBaseUrl = getFirebaseUrl('Users')


  /*
  We use the UrlFetchApp google scripts module
  More info on this here : https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
  */

  UrlFetchApp.fetch(fireBaseUrl, options)

}

function startSync() {

  //Get the currently active sheet

  var sheet = SpreadsheetApp.getActiveSheet()

  //Get the number of rows and columns which contain some content

  var [rows, columns] = [sheet.getLastRow(), sheet.getLastColumn()]


  //Get the data contained in those rows and columns as a 2 dimensional array

  var data = sheet.getRange(1, 1, rows, columns).getValues()


  //Use the syncMasterSheet function defined before to push this data to the "masterSheet" key in the firebase database

  syncMasterSheet(data)

}

Firebase 数据库屏幕截图: screenshot of firebase database

电子表格屏幕截图: screenshot of spreadsheet

最佳答案

数据将以您发送的格式推送到 Firebase 数据库 - Range.getValues() 的返回值是 Object[][](参见here)。

解决方法是将数据合并为您想要的格式。根据您的描述,我认为您可以接受数组的顶层为数字(例如数组索引),但您希望每个项目的内部标记与列相同。

我不会复制您的所有代码,只会复制需要更改的两个函数。首先,startSync 应分别获取标题行和数据行(假设您不希望数据库中包含标题行本身的项目):

function startSync() {
  //Get the currently active sheet
  var sheet = SpreadsheetApp.getActiveSheet()

  //Get the number of rows and columns which contain some content

  var [rows, columns] = [sheet.getLastRow(), sheet.getLastColumn()]

  // Get the data contained in those rows and columns as a 2 dimensional array.
  // Get the headers in a separate array.
  var headers = sheet.getRange(1, 1, 1, columns).getValues()[0];  // [0] to unwrap the outer array
  var data = sheet.getRange(2, 1, rows - 1, columns).getValues();  // skipping the header row means we need to reduce rows by 1.

  //Use the syncMasterSheet function defined before to push this data to the "masterSheet" key in the firebase database

  syncMasterSheet(headers, data)
}

其次,syncMasterSheet() 应在执行 PUT 之前构建要 PUT 的对象:

function syncMasterSheet(sheetHeaders, sheetData) {
  /*
  We make a PUT (update) request,
  and send a JSON payload
  More info on the REST API here : https://firebase.google.com/docs/database/rest/start
  */              
  const outputData = [];
  for(i = 0; i < sheetData.length; i++) {
      var row = sheetData[i];
      var newRow = {};
      for(j = 0; j < row.length; j++) {
        newRow[sheetHeaders[j]] = row[j];
      }
      outputData.push(newRow);
  }

  var options = {
    method: 'put',
    contentType: 'application/json',
    payload: JSON.stringify(outputData)
  }

  var fireBaseUrl = getFirebaseUrl('SpreadsheetTest')

  /*
  We use the UrlFetchApp google scripts module
  More info on this here : https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
  */
  UrlFetchApp.fetch(fireBaseUrl, options)
}

关于firebase - 从Google Sheets脚本重新排列Firebase实时数据库中显示的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880947/

相关文章:

curl - 使用 Firebase Messaging 通过 Postman 发送推送

ios - 如何在 Firebase iOS 中过滤搜索

javascript - 如何从push() firebase中提取id?

javascript - 如何从函数参数谷歌脚本创建文件夹

google-apps-script - 尝试在 Google 表格中进行漏斗可视化

firebase - 如何将 FIREBASE HOSTING 站点置于维护模式?

ios - 如何确认 Firestore 中的数据已快速附加?

java - Firebase 数据库查询未显示在屏幕上

java - Firebase Android ListView 未显示

google-apps-script - url 中带有特殊字符的 UrlFetchApp