【问题标题】:Google Apps Script runs very slowGoogle Apps 脚本运行速度很慢
【发布时间】:2018-01-22 13:24:36
【问题描述】:

我有以下代码从 firebase 数据库中提取数据并在 google sheet 文档中填写数据。 该过程每行大约需要 1 秒,共有 1000 行。

我的代码效率不是很高,还是有更好的方法在 google sheet 上逐行填写信息?

function getAllData() {
  var firebaseUrl = "url-here";
  var base = FirebaseApp.getDatabaseByUrl(firebaseUrl);
  var data = base.getData();
  var iterator = 0
  var obje = []
  //Logger.log(data)
  for(var i in data) {
    iterator++;
    if (iterator > 5) {
      break
    }

    if (data[i] !== null) {
      Logger.log(data[i]);
      obje.push(data[i]) 
    }
  }

     var range = SpreadsheetApp.getActiveSheet().getRange("A5:K5");
    range.setBackground("red");


     //Set Column Names 
    SpreadsheetApp.getActiveSheet().getRange('A5').setValue('Key');
    SpreadsheetApp.getActiveSheet().getRange('B5').setValue('Time');
    SpreadsheetApp.getActiveSheet().getRange('C5').setValue('Location');
    SpreadsheetApp.getActiveSheet().getRange('D5').setValue('Participant_1');
    SpreadsheetApp.getActiveSheet().getRange('E5').setValue('Participant_2');
    SpreadsheetApp.getActiveSheet().getRange('F5').setValue('Category');
    SpreadsheetApp.getActiveSheet().getRange('G5').setValue('team1Score');
    SpreadsheetApp.getActiveSheet().getRange('H5').setValue('team2Score');
    SpreadsheetApp.getActiveSheet().getRange('I5').setValue('gameDetails');


  var number = 5
  Logger.log(obje.length);
  for (var i in obje) {
    Logger.log('Hello' + i)
    number++


      if (i % 2 === 0) {
        var range = SpreadsheetApp.getActiveSheet().getRange("A" + number + ":K" + number);
        range.setBackground("lightblue");
      }
    else {
      var range = SpreadsheetApp.getActiveSheet().getRange("A" + number + ":K" + number);
        range.setBackground("lightgreen");
    }

    //Populate Row Data
    SpreadsheetApp.getActiveSheet().getRange('A' + number).setValue(obje[i].Key);
    SpreadsheetApp.getActiveSheet().getRange('B' + number).setValue(obje[i].Time);
    SpreadsheetApp.getActiveSheet().getRange('C' + number).setValue(obje[i].Location);
    SpreadsheetApp.getActiveSheet().getRange('D'+ number).setValue(obje[i].Participant_1);
    SpreadsheetApp.getActiveSheet().getRange('E'+ number).setValue(obje[i].Participant_2);
    SpreadsheetApp.getActiveSheet().getRange('F'+ number).setValue(obje[i].Category);
    SpreadsheetApp.getActiveSheet().getRange('G'+ number).setValue(obje[i].team1Score);
    SpreadsheetApp.getActiveSheet().getRange('H'+ number).setValue(obje[i].team2Score);
    SpreadsheetApp.getActiveSheet().getRange('I'+ number).setValue(obje[i].gameDetails);
  }
}

【问题讨论】:

  • 每次调用 getRange 都会读取并在您的情况下写回文件。您需要尽量减少这些调用。请参阅 Optimizing Spreadsheet Operations 上的此 Googls Apps 脚本博客文章

标签: javascript google-apps-script google-sheets


【解决方案1】:

如果您的数据在二维数组中,那么这应该可以。 不,这行不通。我今天去学习了一些关于 Firebase 的知识,现在我看到它是一组对象,所以我会弄清楚如何进行工作,然后回来纠正它。我猜我必须一次又一次地做一行。

function getAllData() 
{
  var firebaseUrl = "url-here";
  var base = FirebaseApp.getDatabaseByUrl(firebaseUrl);
  var data = base.getData();//I assume this is correct I have not used firebase
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var headers=['Key','Time','Locaton','Participant_1','Participant_2','Category','teams1Score','team2Score','gameDetails'];
  sh.appendRow(headers);
  sh.getRange(2,1,data.length,headers.length).setValues(data);
}

这是有效的

这是example from another contributor 的链接,但我无法让它工作。所以我在下面稍微修改了一下:

function writeMySheets() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var firebaseUrl = "https://PROJECTID.firebaseio.com/";
  var secret = "SECRET";  
  var base = FirebaseApp.getDatabaseByUrl(firebaseUrl,secret);
  var data = base.getData();
  var keys = Object.keys(data);
  var sheetRow = [];
  var entryKeys;
  var firstTime=true;
  for (index in keys) {
    sheetRow = [];
    entryKeys = Object.keys(data[keys[index]])
    for (i in entryKeys) {
      sheetRow.push(data[keys[index]][entryKeys[i]]);
    }
    //Logger.log(sheetRow);
    if(firstTime)
    {
      sheet.appendRow(entryKeys);//Prints column headers
      firstTime=false;
    }
    sheet.appendRow(sheetRow);                            
  }
}

这似乎适用于来自 QuickStart tutorial 的教程数据,我认为我永远不会开始工作。

【讨论】:

  • 谢谢!不过我想出了另一种方法!
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多