改进谷歌应用程序脚本执行

时间:2017-07-31 20:34:20

标签: google-apps-script

我使用下面的代码将谷歌电子表格中的数据写入mySQL数据库表,这个脚本在有大约4000条记录时工作正常,现在它有超过8000条记录并且运行速度非常慢。是否有工作将所有谷歌电子表格数据读入内存,然后将其写入MySQL数据库。

function myfunction() { 
  var colA;
  var colB; 
  var colC; 
  var colD;
  var colE;  

  var mysqldb = Jdbc.getConnection("jdbc:mysql;dbipaddress","user","pa$$word");
  var sql = mysqldb.createStatement();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1'); 
  var data = sheet.getDataRange().getValues();  

  mysqldb.setAutoCommit(false) 

  var query = "{call [dbo].[sp_copygsheets](?,?,?,?,?)}";
  sql = mysqldb.prepareCall(query);

  for (var i = 1; i < data.length; i++) {
  colA = data[i][0];
  colB = data[i][1]; 
  colC = data[i][2]; 
  colD = data[i][3]; 
  colE = data[i][4];  

  sql.setString(1, colA);
  sql.setString(2, colB); 
  sql.setString(3, colC); 
  sql.setString(4, colD);
  sql.setString(5, colE); 
  sql.addBatch();
  }

  sql.executeBatch();
  mysqldb.commit();

  sql.close();
  mysqldb.close();
}

1 个答案:

答案 0 :(得分:1)

据我所知,当你使用

@Pipe({
name: 'alphabeticPipe'
})

export class AlphabeticPipe implements PipeTransform {
transform(data: any[], searchTerm: string): any[] {
  data.sort((a: any, b: any) => {
  if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
});
return data;
}
}

它将一个块中“sheet1”表中的所有数据读入内存,因此您进行数据检索/读取的方式似乎尽可能快。但是,请注意getDataRange()将包含文本的矩形读入内存,因此,如果您可以对数据进行假设,例如您拥有多少列,则可以优化此项 - 在这种情况下,您只能读取某些内容。通过使用getRange(row,column,numRows,numColumns)来分配到内存中。

我认为可能会让您失望的是转换部分的循环,但我不确定,因此您可以通过使用此代码来衡量时间性能来追踪性能问题的根源: / p>

var data = sheet.getDataRange().getValues();