迭代Google Apps脚本中的对象并打印到Google表格

时间:2017-05-19 17:59:38

标签: javascript arrays for-loop firebase google-sheets

我无法使用此循环将多行打印到我的Google工作表。

第一行追加正常,但我希望函数附加数据变量中的所有对象。

当我使用Logger验证时,数据对象正在从Firebase中正确拉出。

var firebaseUrl = "https://test.firebaseio.com/alerts"; 
var secret = "sssssssssssssssssssss"; 
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret); 
var data = base.getData();

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("feed");
var selection = sheet.getActiveRange();
var range = sheet.getActiveRange();
var values = range.getValues();
var columns = selection.getNumColumns();
var rows = selection.getNumRows();
var num = 2;

function writeToSheets() {  
  for(var i in data) {
    var values = [
      [ data[i].id, data[i].two, data[i].three, data[i].four ]
    ];
    var keys = Object.keys(values[0]);
    var sheetRow = [];
    var entryKeys;
    for (j in keys) {
      sheetRow = [];
      entryKeys = Object.keys(values[keys[j]])
      for (k in entryKeys) {
        sheetRow.push(values[keys[j]][entryKeys[k]]);
      }
      sheet.appendRow(sheetRow);                            
    }
  }
}

1 个答案:

答案 0 :(得分:2)

我刚试过这段代码(假设我猜错了数据结构):

function myFunction() {
  var data = [ 
    {'id': 1, 'two': 'test2', 'three': 'test3', 'four': 'test4'},
    {'id': 2, 'two': 'test2-2', 'three': 'test3-2', 'four': 'test4-2'}
  ]

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("feed");
  var selection = sheet.getActiveRange();
  var range = sheet.getActiveRange();
  var values = range.getValues();
  var columns = selection.getNumColumns();
  var rows = selection.getNumRows();
  var num = 2;

  function writeToSheets() {  
    for(var i in data) {
      var values = [
        [ data[i].id, data[i].two, data[i].three, data[i].four ]
      ];
      var keys = Object.keys(values[0]);
      var sheetRow = [];
      var entryKeys;
      for (j in keys) {
        sheetRow = [];
        entryKeys = Object.keys(values[keys[j]])
        for (k in entryKeys) {
          sheetRow.push(values[keys[j]][entryKeys[k]]);
        }
        sheet.appendRow(sheetRow);                            
      }
    }
  }

  writeToSheets();
}

当我运行它时,在打印出错误为TypeError: Expected argument of type object, but instead had type undefined. (line 26, file "Code")的第一行后失败。 如果在调试模式下运行它,很容易看出到底发生了什么:

  • 您有values数组,其中包含一个元素(第18行)
  • var keys = Object.keys(values[0]);变为[0,1,2,3](我们在values数组的第一个元素中有4个值)
  • 然后,让j从0到3我们得到entryKeys = Object.keys(values[keys[j])
    • 当j = 0时,值[keys [j]] = values [0] - 我们从values获得第一个元素
    • 当j = 1时,值[keys [j]] = values [1] - 这里我们失败了,因为values
    • 中只有1个元素

我不确定你在这里尝试使用所有这些键,但如果你只想打印数据,可以更简单地完成:

  function writeToSheets() {  
    for(var i in data) {
      var item = data[i];
      sheetRow = [];
      for (key in item) {
        sheetRow.push(item[key]);
      }
      sheet.appendRow(sheetRow);                            
    }
  }