批量插入谷歌应用程序脚本

时间:2016-07-05 17:06:04

标签: google-apps-script

在谷歌应用脚​​本中批量插入。我正在使用push将表中的数据写入工作表。有没有办法批量插入3000条记录,并在几分钟后通过触发器循环执行,直到所有记录都插入谷歌应用程序脚本中。



  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();
  }
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:-1)

您可以尝试阅读Batching(但更多的是添加到数据库而不是写入工作表)。

Use batch operations

  

脚本通常需要从电子表格中读取数据,执行计算,然后将数据结果写入电子表格。 Google Apps脚本已经有一些内置的优化功能,例如使用先行缓存来检索脚本可能获取的内容,并编写缓存以保存可能设置的内容。

     

通过最大限度地减少读写次数,您可以编写脚本以最大限度地利用内置缓存。交替读写命令很慢。要加速脚本,请使用一个命令将所有数据读入数组,对数组中的数据执行任何操作,然后使用一个命令写出数据。

没有关于向工作表添加数据的批处理功能,但您可以有效地使用函数来优化代码。

//不要使用此代码。这是一个SLOW,INEFFICIENT代码的例子。 //仅限演示 var cell = sheet.getRange('a1'); for(var y = 0; y&lt; 100; y ++){ xcoord = xmin; for(var x = 0; x&lt; 100; x ++){ var c = getColor_(xcoord,ycoord); cell.offset(y,x).setBackgroundColor(c); xcoord + = xincrement; } ycoord - = yincrement; SpreadsheetApp.flush(); }

  

脚本效率低下:它循环遍历100行和100列,连续写入10,000个单元格。 Google Apps脚本回写缓存会有所帮助,因为它会强制在每行末尾使用flush进行回写。由于缓存,只有100个电子表格调用。

     

但是通过批量调用可以使代码更有效率。这是一个重写,其中单元格区域被读入一个名为colors的数组,颜色分配操作是对数组中的数据执行的,并且数组中的值被写出到电子表格中:

// 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秒钟即可运行!