Google Sheets Script заполняет данные очень медленно - PullRequest
0 голосов
/ 24 октября 2018

В настоящее время я пытаюсь вставить следующее в листы Google с помощью очень простого сценария.

Вид составляет около 16 тыс. Строк и ширину AW.Этот код выполняется и в 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 голосов
/ 29 октября 2018

Причина, по которой ваш скрипт занимает так много времени, заключается в том, что вы записываете каждое значение на лист при извлечении его из базы данных.Там два setValue комментируют внутри цикла.Скажем, на 0,2 секунды каждые 16 000 строк - это много времени.Более эффективный подход - поместить результаты в двумерный массив, а затем после цикла вставить массив на лист с помощью одной команды.Ваше выполнение должно снизиться до нескольких секунд.

Сохраните отдельные циклы для заголовка и строк данных, но измените их следующим образом.(Не проверено)

    // 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...