Google表格脚本非常缓慢地填充数据

时间:2018-10-24 16:11:52

标签: google-apps-script google-sheets

我目前正试图通过一个非常简单的脚本将以下内容添加到Google表格中。

该视图大约16,000行,宽度为A-W。这段代码将在MySQL中执行约1秒钟。 尝试将代码作为脚本运行时,超时时间超过1800秒。

有人知道如何获取数据以更快地填充到工作表中吗?

代码

    var query = ""; 
query += ' SELECT '
+' * '
+' FROM rep_fin_sml_dash_es'



var result  = statement.executeQuery(query);
var num_col = result.getMetaData().getColumnCount();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Supply Data");
sheet.getRange('A2:W').clearContent();


var header = ['Accommodation Provider'];
for(var h = 1; h < header.length; h++ ){
sheet.getRange(1, h+1).setValue(header[h]);
}

var cell = sheet.getRange('A2');

var row = 0;
while(result.next()) {
for(var i=0; i < num_col; i++) {
   cell.offset(row, i).setValue(result.getString(i+1));
 }
 row++;
}

//tidy up
result.close();
statement.close();
connection.close(); 

}

1 个答案:

答案 0 :(得分:0)

您的脚本花费很长时间的原因是,您在从数据库中检索表时将所有值写入表。在循环中内部有两个setValue受到赞扬。例如,每0.2秒x 16,000行-这是很多时间。一种更有效的方法是将结果推送到2d数组中,然后在循环后 使用单个命令将该数组粘贴到工作表中。您的执行速度应该下降到几秒钟左右。

保留标题行和数据行的单独循环,但是要像这样更改它们。 (未经测试)

    // declare some arrays
    masterValue = [];
    value = [];

    // get the header row
    for (var h = 1; h < header.length; h++) {
      value.push(header[h]); // header row to an array
    }
    masterValue.push(value); //push the header row into a 2d array.

    // Loop through the data
    while (result.next()) {
      value = []; // reset the value array
      for (var i = 0; i < num_col; i++) {
        value.push(result.getString(i + 1)); // get the data from each column
      }
      row++;
      masterValue.push(value);
    }

<<insert code closing connection >>

  // update the target sheet with the contents of the array
  sheet.getRange(1, 1, masterValue.length, value.length);
  sheet.setValues(masterValue);