2013-09-07 2 views
0

У меня есть Google приложения скрипт, который работает в одном экземпляре, но не другойошибка Google Apps Script при попытке чтения в базу данных с помощью JDBC

Оба сценария идентичны, единственное различие, которое я запрограммировал это 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 в db, это просто отлично), функция не работает.

Это неработающая функция.

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-й функции или 1-м приведенным мной примером. И оба они работали в первый раз, когда я пытался их запустить.

Любые идеи, кто-нибудь? Я даже не использовал специальный код, этот код в основном представляет собой пример документации Google Apps.

Я использую скрипты Google в электронной таблице Документов Google, подключаясь к mysql. Я открыл удаленные подключения к mysql и имею 2 рабочие таблицы, поэтому я знаю, что соединение работает.

ответ

0

Issue 703 В Отслеживании проблем продолжали видеть, как пользователи сообщают об этом экземплярах с июля 2011 года. Посетите и отправьте сообщение об ошибке для обновлений и добавьте любую информацию, которая может помочь поисковикам изолировать проблему.

+0

спасибо за указатель. приятно знать, что я не страдаю в одиночку. Я обновил трекер. Забавно, мне пришлось удалить лист с проблемами, а затем добавить еще раз. Было немного боли, чтобы воссоздать названные диапазоны, но после этого все работало как прелесть, так что это определенно не был код. – MSM

0

Возможно ли, что ваши петли слишком сильно накладывают на 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 с помощью быстрого двойного электронного цикла.

Дайте мне знать, как это происходит, если вам нужна дополнительная информация.

Смежные вопросы