0

あるインスタンスでは機能しているが、別のインスタンスでは機能していない Google Apps スクリプトがあります

どちらのスクリプトも同じです。私がプログラムした唯一の違いは、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()));
};

データベースを更新した後、これを2回実行しましたが、結果は完璧で、まさに期待どおりでした。

ここで、同じ関数を使用してクエリのみを変更しようとすると (データベースで 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));、上記で提供した 2 番目の関数にあります。2番目の関数のこの行と私が提供した最初の例の違いは見つかりません----そして、最初に実行しようとしたときに両方とも機能しました。

アイデアはありますか?カスタムコードも使用していません。コードは基本的にGoogleアプリのドキュメントの例です。

Google ドキュメント スプレッドシート内で Google スクリプトを使用して、mysql に接続しています。私は mysql へのリモート接続を開いており、2 つの作業用スプレッドシートを持っているので、接続が機能していることがわかります。

4

2 に答える 2

0

ループがスプレッドシート API に負担をかけすぎている可能性はありますか?

SQL行からデータ構造を埋めて、結果の2次元データ配列を正しい範囲に適用する傾向があります。

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 に負荷をかけません。

さらに情報が必要な場合は、どうなるか教えてください。

于 2013-09-07T04:45:08.170 に答える
0

イシュー トラッカーのイシュー 703では、2011 年 7 月以降、ユーザーがこの事例を報告し続けています。更新のためにイシューにアクセスしてスターを付け、Google 社員が問題を特定するのに役立つ可能性のある情報を追加してください。

于 2013-09-07T01:44:54.907 に答える