Получить данные из базы данных SQL в Google Sheets - PullRequest
0 голосов
/ 14 апреля 2020

Теперь при каждом запуске скрипта все данные перезаписываются. Как сделать это при следующем запросе, выбрать только новые данные и добавить их под существующими данными на листе? Спасибо! Я использую этот скрипт:

var server = 'server';
var port = 3306;
var dbName = 'name';
var username = 'mane';
var password = 'pass';
var url = 'jdbc:mysql://'+server+':'+port+'/'+dbName;

function readData() {
var conn = Jdbc.getConnection(url, username, password);
var stmt = conn.createStatement();
var results = stmt.executeQuery('SELECT order_id, firstname FROM id_order ORDER BY id_order.order_id 
ASC');
var metaData=results.getMetaData();
var numCols = metaData.getColumnCount();
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName('sheet_sql');
sheet.clearContents();
var arr=[];

for (var col = 0; col < numCols; col++) {
arr.push(metaData.getColumnName(col + 1));
}

sheet.appendRow(arr);

while (results.next()) {
arr=[];
for (var col = 0; col < numCols; col++) {
arr.push(results.getString(col + 1));
}
sheet.appendRow(arr);
}

results.close();
stmt.close();
sheet.autoResizeColumns(1, numCols+1);
}

ScriptApp.newTrigger('readData')

.timeBased()

.everyHours(2)

.create();

1 Ответ

1 голос
/ 14 апреля 2020

Глядя на ваш код, я предполагаю, что вы фактически очищаете лист (clearContents()) каждый раз, когда получаете результаты базы данных.

Если вы хотите sh изменить это поведение и избегать использования clearContents(), вам необходимо обновить оператор SQL, чтобы исключить все уже извлеченные order_id.

Если у вас не слишком много записей, вы можете просто расширить свое заявление SQL, включив в него предложение NOT IN, которое исключит все записи, имеющиеся у вас на листе.

В качестве альтернативы, если ваша переменная order_id упорядочена (ожидаемое увеличение или уменьшение), вы можете использовать предложение BETWEEN, используя min order_id и max order_id в вашей электронной таблице.

Если все предыдущие варианты для вас недопустимы, вы можете взять все записи в выписке SQL и затем проверить Apps Script , если запись уже была вставлена ​​ранее, но на этом этапе вы в основном выполняете ту же работу, что и раньше, потому что вам нужно будет проверять каждую отдельную запись, извлеченную из базы данных.


Хотя Если вы можете, вы можете создать столбец / таблицу в базе данных SQL для хранения всех уже вставленных записей, так что вы можете просто извлечь все не вставленные записи в одну заявление.

...