【问题标题】:Google Apps Script running very slow [duplicate]Google Apps 脚本运行速度很慢[重复]
【发布时间】:2021-12-29 02:38:33
【问题描述】:

我的 Google Sheets Apps 脚本一直超时 - 它从 MySQL 数据库中进行简单读取并加载数据,它查询一个仅托管 150 行的单个持久表,因此它没有理由超时。

我的脚本如下所示:

var server = 'IP';
var port = PORT;
var dbName = 'DB';
var username = 'UN';
var password = 'PW';
var url = 'jdbc:mysql://'+server+':'+port+'/'+dbName;

function readData() {
 var conn = Jdbc.getConnection(url, username, password);
 var stmt = conn.createStatement();
 var results = stmt.executeQuery('SELECT * FROM db.table');
 var metaData=results.getMetaData();
 var numCols = metaData.getColumnCount();
 var spreadsheet = SpreadsheetApp.getActive();
 var sheet = spreadsheet.getSheetByName('SheetName');
 sheet.clearContents();
 var arr=[];

 for (var col = 0; col < numCols; col++) {
   arr.push(metaData.getColumnName(col + 1));
 }

 sheet.appendRow(arr);

while (results.next()) {
 arr=[];
 for (var col = 0; col < numCols; col++) {
   arr.push(results.getString(col + 1));
 }
 sheet.appendRow(arr);
}

results.close();
stmt.close();
/*sheet.autoResizeColumns(1, numCols+1);*/
} 

/*ScriptApp.newTrigger('readData')
.timeBased()
.everyHours(2)
.create();*/

有什么办法可以更好地处理导入以加快导入速度,正如我所说,数据被持久化到数据库上的一个表中,该表只有大约 150 行和 10-15 列,所以数据是小型且可从 DB GUI 即时查询

【问题讨论】:

  • 使用setValues() 而不是appendRow()。还可以尝试console.time() 找出导致更多时间的脚本部分。
  • @TheMaster - 会看看这个!谢谢!

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


【解决方案1】:

如果您可以在流的两端编写代码并通过 ssl 访问它们,则尽管可以实现更高的性能,但这提供了一点速度。

var server = 'IP';
var port = PORT;
var dbName = 'DB';
var username = 'UN';
var password = 'PW';
var url = 'jdbc:mysql://' + server + ':' + port + '/' + dbName;

function readData() {
  var conn = Jdbc.getConnection(url, username, password);
  var stmt = conn.createStatement();
  var results = stmt.executeQuery('SELECT * FROM db.table');
  var metaData = results.getMetaData();
  var numCols = metaData.getColumnCount();
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName('SheetName');
  sheet.clearContents();
  var arr = [];//this is where you store all of the data
  let row = [];
  for (var col = 0; col < numCols; col++) {
    row.push(metaData.getColumnName(col + 1));
  }
  arr.push(row);
  while (results.next()) {
    row = [];
    for (var col = 0; col < numCols; col++) {
      row.push(results.getString(col + 1));
    }
    arr.push(row)
  }

  sheet.getRange(1, 1, arr.length, arr[0].length).setValues(arr);//this is where you save all of your data into the spreadsheet thus saving you all of the individual writes to the rows.
  results.close();
  stmt.close();
}

Class Range setValues() Method

【讨论】:

  • 这无疑将我的数据加载速度提高了 10 倍!谢谢!
  • 如果 odbc 有办法将所有数据作为 2d 数组取出,这将是极大地加快进程的好方法。就个人而言,我已经在我的数据库服务器上编写了一些例程来为我执行此操作,并且我通过 fetches 或在谷歌应用程序脚本的情况下通过 UrlFetchApp 访问它们。他们真的可以加快速度。我不想在这里经历所有这些,因为它涉及双方的代码,我只能说,当你准备好时,你就会知道。然后你可以根据你的时间价值为自己或更高的人写它。
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多