Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 上传40k+;从SQL到Google表的行_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 上传40k+;从SQL到Google表的行

Google apps script 上传40k+;从SQL到Google表的行,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在尝试从SQL填充到GoogleSheets一个40k行的记录集。不幸的是,脚本继续超过允许的最大时间(6分钟?)。以下是使用的代码: var qry = "select custid from customers "; var con = Jdbc.getConnection(connection,user,pw); var stmt = con.createStatement(); var rs = stmt.executeQuery(qry); dataRange

我正在尝试从SQL填充到GoogleSheets一个40k行的记录集。不幸的是,脚本继续超过允许的最大时间(6分钟?)。以下是使用的代码:

  var qry = "select custid from customers ";
  var con = Jdbc.getConnection(connection,user,pw);
  var stmt = con.createStatement();
  var rs = stmt.executeQuery(qry);

  dataRange = sheet.getRange("a2")

  while(rs.next()) {
    dataRange.setValue(rs.getString(1));
    dataRange = dataRange.offset(1,0);
  }

  rs.close();
  stmt.close();
  con.close();
有没有更有效的方法?Excel中是否有类似于copyFromRecordset的功能?(此示例代码仅显示一个列值。添加到查询中的列越多,返回的行就越少。)

如果网络速度是一个重要因素,那么我们的连接是50mb下行/10mb上行


提前感谢您的帮助

假设超时发生在数据库端,那么批处理将有所帮助。不要在单个查询中获取所有行,而是获取前几百行或几千行。完成查询后,关闭语句并使用新参数重新打开它,以获取下一个几百或几千个参数。您可以为所有查询保持相同的连接

具体如何进行数据库分页取决于您的SQL数据库是什么


另一个选项是将数据缓存在内存中,关闭数据库连接,然后更新电子表格。

我从未在应用程序脚本中使用jdbc,但您的每个循环脚本都会将数据添加到工作表中,这非常耗时。最好的方法是构建一个数组,然后将数组中的所有数据推送到电子表格中

var qry = "select custid from customers ";
  var con = Jdbc.getConnection(connection,user,pw);
  var stmt = con.createStatement();
  var rs = stmt.executeQuery(qry);

  dataRange = sheet.getRange("a2")
  var tab = [];
  while(rs.next()) {
    tab.push([rs.getString(1)]);
    //dataRange = dataRange.offset(1,0);
  }
  sheet.getRange(1, 2, tab.length, tab[0].length).setValues(tab);
  rs.close();
  stmt.close();
  con.close();
这将使您在脚本中节省大量时间,但不确定40000行是否适合这6分钟。不知道jdbc服务的性能


圣菲那太好了!该脚本现在运行约14-16秒!如何修改它来处理多个列?我发现它可以工作:tab.push([rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6)];确切的答案是:-)现在速度真的快了。不确定节省的时间是否会如此之高。。。