У меня есть сценарий, который использует службу JDBC для запроса базы данных MySQL. Сценарий выполнит запрос, а затем распечатает результаты в таблице Google.
Таблица SQL имеет 23 столбца, а данные, содержащиеся в столбце 4, содержат несколько строковых значений, разделенных запятыми. Например, «Солнечная, дизельная».
На данный момент запрос вытащит все из столбца, но мне нужна только часть строки перед запятой, поэтому только "Solar".
Я понимаю, что «SUBSTRING» может выполнить эту работу, но я не могу найти, как использовать его в GAS. Это сценарий GAS ниже:
function ProjectSelect(){
//defining variables
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var sheetTab = sheet.getSheetByName('Project Selector')
//defining inputs to SQL statement
//conditionals
var location = sheetTab.getRange(3,2).getValue();
var country = sheetTab.getRange(5,2).getValue();
var opStatus = sheetTab.getRange(7,2).getValue();
var gridStatus = sheetTab.getRange(9,2).getValue();
var fuel = sheetTab.getRange(11,2).getValue();
var technology = sheetTab.getRange(13,2).getValue();
var ownership = sheetTab.getRange(15,2).getValue();
//column headers
var data = sheetTab.getRange(2,4,1,23).getValues();
for (i in data) {
var row = data[i];
var column1 = row[0];
var column2 = row[1];
var column3 = row[2];
var column4 = row[3];
var column5 = row[4];
var column6 = row[5];
var column7 = row[6];
var column8 = row[7];
var column9 = row[8];
var column10 = row[9];
var column11 = row[10];
var column12 = row[11];
var column13 = row[12];
var column14 = row[13];
var column15 = row[14];
var column16 = row[15];
var column17 = row[16];
var column18 = row[17];
var column19 = row[18];
var column20 = row[19];
var column21 = row[20];
var column22 = row[21];
var column23 = row[22];
//SQL statement build & write
var test = conn.createStatement();
if (column2 == '') {var col2 = ''} else {var col2 =',' + column2}
if (column3 == '') {var col3 = ''} else {var col3 =',' + column3}
if (column4 == '') {var col4 = ''} else {var col4 =',' + column4}
if (column5 == '') {var col5 = ''} else {var col5 =',' + column5}
if (column6 == '') {var col6 = ''} else {var col6 =',' + column6}
if (column7 == '') {var col7 = ''} else {var col7 =',' + column7}
if (column8 == '') {var col8 = ''} else {var col8 =',' + column8}
if (column9 == '') {var col9 = ''} else {var col9 =',' + column9}
if (column10 == '') {var col10 = ''} else {var col10 =',' + column10}
if (column11 == '') {var col11 = ''} else {var col11 =',' + column11}
if (column12 == '') {var col12 = ''} else {var col12 =',' + column12}
if (column13 == '') {var col13 = ''} else {var col13 =',' + column13}
if (column14 == '') {var col14 = ''} else {var col14 =',' + column14}
if (column15 == '') {var col15 = ''} else {var col15 =',' + column15}
if (column16 == '') {var col16 = ''} else {var col16 =',' + column16}
if (column17 == '') {var col17 = ''} else {var col17 =',' + column17}
if (column18 == '') {var col18 = ''} else {var col18 =',' + column18}
if (column19 == '') {var col19 = ''} else {var col19 =',' + column19}
if (column20 == '') {var col20 = ''} else {var col20 =',' + column20}
if (column21 == '') {var col21 = ''} else {var col21 =',' + column21}
if (column22 == '') {var col22 = ''} else {var col22 =',' + column22}
if (column23 == '') {var col23 = ''} else {var col23 =',' + column23}
//Define Conditional
var conditional =
sheet.getSheetByName('Config').getRange(2,22).getValue();
Logger.log(conditional);
//SQL statement build & write
var query = 'SELECT '+ column1 + col2 + col3 + col4 + col5 + col6 + col7 + col8 + col9 + col10 + col11 + col12 + col13 + col14 + col15 + col16 + col17 + col18 + col19 + col20 + col21 + col22 + ' FROM unit '+conditional
var sql = conn.createStatement();
var results = sql.executeQuery(query);
var numCols = results.getMetaData().getColumnCount();
//starting cell
var cell = sheetTab.getRange(2,4);
var numCols = results.getMetaData().getColumnCount();
var numRows = sheetTab.getLastRow();
var headers;
var row = 0;
//clear current dataset
sheetTab.getRange(3,4,numRows, numCols).clearContent();
//write sql statement data into sheet
for(var i = 1; i <= numCols; i++){
headers = results.getMetaData().getColumnName(i);
cell.offset(row, i-1).setValue(headers);
}
while (results.next()) {
var rowString = '';
for (var col = 0; col < numCols; col++) {
rowString += results.getString(col + 1) + '\t';
cell.offset(row +1, col).setValue(results.getString(col +1 ));
}
row++
Logger.log(rowString)
}
}
results.close();
test.close();
}
Столбцы "col2", "col3" и т. д. Определены выше и представляют собой заголовки столбцов, уже определенные на листе.
Я читал, что вы не можете запускать более одного оператора SQL в одной строке в GAS и что запрос нужно будет разбить, а затем снова соединить вместе.
Извините, мне, наверное, стоило выложить полный сценарий:
Эта схема звучит как нарушение Правило нуля, единицы или бесконечности из нормализация базы данных. Если возможно, попробуйте преобразовать это в реляционную структуру «один ко многим», так как это сделает ваш запрос почти тривиальным. Каждый раз при составлении таких операторов с именами столбцов должно быть абсолютно уверен, чтобы пользовательский ввод не передавался без экранирования и чтобы имена столбцов были правильно экранированы для контекста выполнения. В MySQL это означает окружение обратными кавычками.
Спасибо, посмотрю. Я все еще учусь использовать SQL и GAS. Приведенный выше сценарий действительно работает так, как мне нужно в данный момент, но в любом случае было бы здорово его улучшить.
Вопрос непонятный. Это о методе подстроки JavaScript или о функции подстроки SQL? Может ли ваш код подключиться к базе данных SQL и получить результат? Вы получаете сообщение об ошибке? Пожалуйста, проверьте минимальный воспроизводимый пример.
У меня нет предпочтений перед Javascript или SQL, в зависимости от того, что подойдет. Приведенный выше код работает, он подключается к базе данных SQL, выполняет запрос, извлекает результаты и печатает их на листе. Мне просто нужен способ извлечения части строки, содержащейся в столбце 4.






Вы не можете просто сложить кучу случайных строк и ожидать, что выйдет оператор SQL. Здесь нужен более дисциплинированный подход.