Reputation: 544
I have this code to auto insert/update data in Google Sheet from MySql database.
var server = 'server';
var port = 3306;
var dbName = 'db_name';
var username = 'db_username';
var password = 'db_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 .... ');
var metaData=results.getMetaData();
var numCols = metaData.getColumnCount();
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName('Sheet1');
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);
}
How can I set starting row and column for the data inserted? Now it starts from 'A1' and I'd like to start from 'D5'?
Tried to add var cell = sheet.getRange('A1');
after var sheet =
with no result.
Upvotes: 0
Views: 95
Reputation: 2861
The basic idea would be to split the problem into 2:
function readData() {
// Get data
const conn = Jdbc.getConnection(url, username, password)
const stmt = conn.createStatement()
const results = stmt.executeQuery('SELECT .... ')
const columnNames = getColumnNames(results)
const data = getStringData(results)
results.close()
stmt.close()
// Set data to spreadsheet
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
const sheet = spreadsheet.getSheetByName('Sheet1')
sheet.clearContents()
addToRange(sheet.getRange('B5'), [
columnNames,
...data,
])
}
function getColumnNames(results) {
const result = []
const metaData = results.getMetaData()
const numCols = metaData.getColumnCount()
for (let col = 0; col < numCols; col++) {
result.push(metaData.getColumnName(col + 1))
}
return result;
}
function getStringData(results) {
const result = [];
while (results.next()) {
const row = [];
for (let col = 0; col < numCols; col++) {
row.push(results.getString(col + 1))
}
result.push(row)
}
return result
}
function addToRange(range, values) {
return range
.offset(0, 0, values.length, values[0].length)
.setValues(values)
}
Adding function also make the code more readable and help to split the problem.
Note that I'm adding the column headers to the row 5 (I join the data and the headers). You can set them separately in different ranges if you so desire.
Upvotes: 1
Reputation: 1000
try below code:
var server = 'server';
var port = 3306;
var dbName = 'db_name';
var username = 'db_username';
var password = 'db_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 .... ');
var metaData=results.getMetaData();
var numCols = metaData.getColumnCount();
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('Sheet1');
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);
var range = sheet.getRange(5,4, arr.length, arr[0].length);
range.setValues(arr);
}
results.close();
stmt.close();
sheet.autoResizeColumns(1, numCols+1);
}
Upvotes: 0