【问题标题】:Google Apps Script error when trying to read into a database using jdbc尝试使用 jdbc 读取数据库时出现 Google Apps 脚本错误
【发布时间】:2013-09-07 01:21:28
【问题描述】:

我有一个谷歌应用程序脚本在一个实例中运行,但不是另一个实例

两个脚本是相同的,我编写的唯一区别是 jdbc 查询。

这里是工作函数:

function wbk() {
  var conn = Jdbc.getConnection("jdbc:mysql://aaa.aaaa.org:3306/aaaaa", "aaaa", "bbbbb");
  var stmt = conn.createStatement();
  stmt.setMaxRows(10000);
  var start = new Date();
  var rs = stmt.executeQuery("SELECT `DateUpdate`, `AllianceName`, `PlayerName`, `Score`, `Rank`, `TotalCities`, `FameTotal`, `FameRank`, `DefeatedTotal`, `DefeatedRank`, `PlunderTotal`, `PlunderRank` FROM `Member` WHERE AllianceID='2' OR AllianceID='48'");
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var first = doc.getSheetByName("WBK");
  first.activate();
  var cell = first.getRange('b2');
  var row = 0;
  while (rs.next()) {
    for (var col = 0; col < rs.getMetaData().getColumnCount(); col++) {
      cell.offset(row, col).setValue(rs.getString(col + 1));
    }
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
  var end = new Date();
  Logger.log("time took: " + (end.getTime() - start.getTime()));
};

我在更新数据库后运行了两次,结果很完美,符合预期。

现在,当我尝试使用相同的函数,并且只修改查询时(我检查了数据库中的 SQL 语句,这很好),函数失败。

这里是非工作函数。

function WC_Combined() {
  var conn = Jdbc.getConnection("jdbc:mysql://aaa.aaaa.org:3306/aaaaa", "aaaa", "bbbbb");
  var stmt = conn.createStatement();
  stmt.setMaxRows(10000);
  var start = new Date();
  var rs = stmt.executeQuery("SELECT `DateUpdate`, `AllianceName`, `PlayerName`, `Score`, `Rank`, `TotalCities`, `FameTotal`, `FameRank`, `DefeatedTotal`, `DefeatedRank`, `PlunderTotal`, `PlunderRank` FROM `Member` where AllianceID='195' OR AllianceID='494'");
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var first = doc.getSheetByName("Combined");
  first.activate();
  var cell = first.getRange('b2');
  var row = 0;
  while (rs.next()) {
    for (var col = 0; col < rs.getMetaData().getColumnCount(); col++) {
      cell.offset(row, col).setValue(rs.getString(col + 1));
    }
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
  var end = new Date();
  Logger.log("time took: " + (end.getTime() - start.getTime()));
};

我在 Google 的调试控制台中收到的错误消息是

Service error: Spreadsheets (line 110, file "Code")

在我上面提供的第二个函数中,我的代码中的第 110 行是 cell.offset(row, col).setValue(rs.getString(col + 1));;我找不到第二个函数中的这一行与我提供的第一个示例之间的任何区别----并且它们在我第一次尝试运行它们时都有效。

任何想法,任何人?我什至没有使用自定义代码,代码基本上是谷歌应用程序文档示例。

我在 Google Docs 电子表格中使用 Google 脚本,连接到 mysql。我已经打开了到 mysql 的远程连接,并且有 2 个工作电子表格,所以我知道连接有效。

【问题讨论】:

    标签: mysql sql jdbc google-apps-script


    【解决方案1】:

    自 2011 年 7 月以来,问题跟踪器中的Issue 703 继续看到用户报告此问题。访问并为问题加注星标以获取更新,并添加任何可能有助于谷歌员工隔离问题的信息。

    【讨论】:

    • 感谢您的指点。很高兴知道我并不孤单。我更新了追踪器。有趣的是,我不得不删除有问题的工作表,然后重新添加。重新创建命名范围有点痛苦,但在那之后一切都像魅力一样,所以绝对不是代码。
    【解决方案2】:

    您的循环是否可能对电子表格 API 造成了太大压力?

    我更倾向于从我的 sql 行填充数据结构,然后将生成的二维数据数组应用到正确的范围。

    var data = [];
    while (rs.next()) {
        var rowData = [];
        for (var col = 0; col < rs.getMetaData().getColumnCount(); col++) {
            rowData[col] = (rs.getString(col + 1));
        }
        data[row] = rowData;
        row++;
    }
    
    var range = first.getDataRange(1,2,row, col+1); // check edges or uses a1 notation
    
    range.setValues(data);
    

    这还具有效率更高的优点,并且不会通过快速双循环对 API 造成压力。

    如果您需要更多信息,请告诉我进展如何。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多