2016-07-05 2 views
1

Пакетная вставка в скрипт Google Apps. Я использую push для записи данных из таблицы в лист. Есть ли способ сделать пакетную запись 3000 записей и выполнить цикл через триггер, который будет выполнен через пару минут, пока все записи не будут вставлены в сценарий приложений Google.Пакетная вставка скрипта Google Apps

function myBatchInsert() { 
 
    var connection = Jdbc.getConnection("jdbc:mysql://host:port", "user", "passwrd"); 
 
    var query = connection.createStatement(); 
 
    var result = query.executeQuery('SELECT * FROM Table WHERE'); 
 
    var googlespreadsheet; 
 
    var sheet; 
 
    var googlespreadsheetSheetName = "Table"; 
 

 
    googlespreadsheet = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId()); 
 

 
    var datasheet = googlespreadsheet.getSheetByName("Table"); 
 
    datasheet.setName("Table"); 
 

 
    SpreadsheetApp.setActiveSpreadsheet(googlespreadsheet); 
 
    sheet = SpreadsheetApp.setActiveSheet(googlespreadsheet.getSheetByName(googlespreadsheetSheetName)); 
 

 
    var columncount = result.getMetaData().getColumnCount(); 
 
    var columnName; 
 

 
    for (var column = 1; column <= columncount; column++) { 
 
     sheet.getRange(1, column).setValue(result.getMetaData().getColumnName(column)); 
 
    } 
 

 
    var document = SpreadsheetApp.getActiveSpreadsheet(); 
 
    var cell = document.getRange('A2'); 
 
    var row = 0; 
 
    var data = []; 
 

 
    for (var i = 0; i < 1; i++) { 
 
     while (result.next()) { 
 
     var rowData = []; 
 
     for (var column = 0; column < result.getMetaData().getColumnCount(); column++) { 
 
      rowData.push(result.getString(column + 1)); 
 
     } 
 
     data.push(rowData); 
 
     } 
 

 
     sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data); 
 
    } 
 

 
    result.close(); 
 
    query.close(); 
 
    connection.close(); 
 
    }

ответ

-2

Вы можете попробовать читать о Batching (но это больше на добавление в базу данных, чем писать на листах).

Use batch operations

Сценарии обычно нужно прочитать в данных из электронной таблицы, выполнять вычисления, а затем записать результаты данных в электронную таблицу. Сценарий Google Apps уже имеет встроенную оптимизацию, например, с использованием кэширования с открытым исходным кодом для получения того, что сценарий может получить и написать кэширование, чтобы сохранить то, что может быть установлено.

Вы можете писать сценарии, чтобы максимально использовать встроенное кеширование, минимизируя количество чтений и записей. Чередование команд чтения и записи происходит медленно. Чтобы ускорить работу скрипта, прочитайте все данные в массиве с помощью одной команды, выполните любые операции с данными в массиве и напишите данные с помощью одной команды.


Там нет партии функции относительно добавления данных листов, но вы можете использовать функцию эффективно оптимизировать свой код.

// НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД. Это пример кода SLOW, INEFFICIENT. // ТОЛЬКО ДЛЯ ДЕМОНСТРАЦИИ var cell = sheet.getRange ('a1'); для (var y = 0; y < 100; y ++) { xcoord = xmin; для (var x = 0; x < 100; x ++) { var c = getColor_ (xcoord, ycoord); cell.offset (y, x) .setBackgroundColor (c); xcoord + = xincrement; } ycoord - = yincrement; SpreadsheetApp.flush(); }

Сценарий неэффективен: он проходит через 100 строк и 100 столбцов, последовательно записывая до 10000 ячеек. Кэш обратной записи для скриптов Google Apps помогает, потому что он заставляет обратную запись использовать флеш в конце каждой строки. Из-за кэширования в Таблице всего 100 вызовов.

Но код может быть сделан намного эффективнее путем пакетной обработки вызовов. Вот переписан, в котором диапазон ячеек считывается в массив с именем цвета, операция присваивания цвета выполняется на данных в массиве, а значения в массиве записываются в таблицу:

// OKAY TO USE THIS EXAMPLE or code based on it. 
var cell = sheet.getRange('a1'); 
var colors = new Array(100); 
for (var y = 0; y < 100; y++) { 
xcoord = xmin; 
colors[y] = new Array(100); 
for (var x = 0; x < 100; x++) { 
colors[y][x] = getColor_(xcoord, ycoord); 
xcoord += xincrement; 
} 
ycoord -= yincrement; 
} 
sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors); 

Неэффективный код занимает около 70 секунд. Эффективный код работает всего за 1 секунду!

Смежные вопросы