0

У меня есть лист, который содержит приблизительно 1400 строк для отслеживания парковочных мест для гаража. До сих пор с помощью я смог открыть боковую панель, создать окно поиска и добавить кнопки «Поиск» и «Закрыть». Прямо сейчас, когда нажата кнопка «Поиск», похоже, что она не захватывает номер пробела в окне поиска, а также не связывается со сценарием.Создание пользовательского поиска в боковой панели Google Таблиц

Мой вопрос, как я могу получить информацию из окна поиска, смотрите через колонку B для матча, взять информацию из столбцов BG в этой строке, и возвращает информацию в следующем формате:

  • Колонка B: colBInfo
  • Колонка C: colCInfo
  • Колонка D: colDInfo
  • Колонка E: colEInfo
  • Колонка F: colFInfo
  • Колонка G: colGInfo
  • Рядное Количество: rowNumInfo

Я сделал отладки и фонд, который Function searchInfo дает ошибку: координаты или размеры диапазона являются недействительными. (строка 28, файл «Боковая панель»), потому что rowWithSpaceNumber возвращает -1. Я верю, что когдаSpaceNumber сможет получить информацию из окна поиска, она исправит эту ошибку.

Menu.gs

function onOpen() { 

    SpreadsheetApp.getUi() 
    .createMenu('Sidebar') 
    .addItem('Show Sidebar', 'showSidebar') 
    .addToUi(); 
} 

Sidebar.gs

function showSidebar() { 
var html = HtmlService.createHtmlOutputFromFile('index') 
    .setSandboxMode(HtmlService.SandboxMode.IFRAME) 
    .setTitle('Individual Space Lookup'); 
SpreadsheetApp.getUi() 
    .showSidebar(html); 
SpreadsheetApp.getActiveSpreadsheet().toast('Sidebar opened', 'Status'); 
} 

function searchInfo(theSpaceNumber) { 
var ss =  SpreadsheetApp.openById("1isuunf_SRThXe8C71ROKAC2JvjZ49w05MrLE2323Yqk"); 
Logger.log("Book name: "+ ss.getName()); 
var sheetWithData = ss.getSheetByName("Master Sheet"); 
Logger.log("Sheet name: "+ sheetWithData.getName()); 
var numOfRowsInSheet = sheetWithData.getLastRow(); 
var values = sheetWithData.getSheetValues(4, 2, numOfRowsInSheet, 1); 
Logger.log("Values: "+ values); 


//Convert two dimensional array to one dimensional array. 
var theRowValues = []; 
for (var i = 0; i < values.length; i++) { 
theRowValues.push(values[i]); 
}; 

var rowWithSpaceNumber = theRowValues.indexOf(theSpaceNumber); 
Logger.log("rowWithSpaceNumber: " + theSpaceNumber); 

//Get 6 columns of data: getSheetValues(startRow, startColumn, numRows, numColumns) 
var colBInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 2, 1, 1); 
var colCInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 3, 1, 1); 
var colDInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 4, 1, 1); 
var colEInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 5, 1, 1); 
var colFInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 6, 1, 1); 
var colGInfo = sheetWithData.getSheetValues(rowWithSpaceNumber, 7, 1, 1); 
var rowNumInfo = sheetWithData.getRange(rowWithSpaceNumber, 2); 
Logger.log("Row Number: " + rowWithSpaceNumber); 

return app (colBInfo, colCInfo, colDInfo, colEInfo, colFInfo, colGInfo, rowNumInfo);  

}; 

index.html

<div> 

    Search Individual Space: <input type="search" id="idUserInput"/> 

<BR> 

<input type="button" value="Search" 
onclick="getUserInput()" /> 

<input type="button" value="Close" 
onclick="google.script.host.close()" /> 


<script> 

function onSuccess(colBInfo, colCInfo, colDInfo, colEInfo, colFInfo, colGInfo, rowNumInfo) { 


    alert('Column B: ' + colBInfo 
    <br>'Column C: ' + colCInfo 
    <br>'Column D: ' + colDInfo 
    <br>'Column E: ' + colEInfo 
    <br>'Column F: ' + colFInfo 
    <br>'Column G: ' + colGInfo 
    <br>'Row Number: ' + rowNumInfo 

    ); 
} 

function getUserInput() { 
var theSpaceNumber = document.getElementById("idUserInput").value; 

google.script.run.withSuccessHandler(onSuccess) 
    .searchInfo(theSpaceNumber); 
    }; 

</script> 

</div> 
+0

'var values ​​= sheetWithData.getSheetValues ​​(4, 2, numOfRowsInSheet, 1);': изменить 1 на любой номер последнего столбца. – rpm

+0

@ user1989, изменяя с 1 по 6, вы получите все данные с листа, чтобы искать введенные данные, а не просто искать 1 столбец. Я думаю, что самая большая проблема, с которой я сталкиваюсь, заключается в том, что введенные данные в окне поиска не получают «вытащили» поле правильно и вызваны. Любые предложения о том, как передать введенную информацию в поле для остальной части скрипта? –

+0

Мне не кажется, что проблема передачи значения GAS. Правильно. – rpm

ответ

1

По мне, есть две причины, если это невозможно.

Во-первых, причина для показа -1 заключается в том, что он не находит переданное значение в вашей таблице.

Во-вторых, тип данных вашего переданного значения будет string, а тип данных ваших значений - theRowValues - object. Таким образом, он всегда терпит неудачу, даже если вы передаете данные, доступные в электронной таблице, из-за наличия двух разных типов при сравнении.

Чтобы решить эту ошибку типа,

Изменить theRowValues.push(values[i]) с следующей строкой в ​​sidebar.gs,

theRowValues.push(Utilities.formatString("%s", values[i])); 

Это будет конвертировать ваши данные электронной таблицы из object типа данных string типа данных.

После этого вам все равно придется обрабатывать ошибку в вашей электронной таблице.

Представьте себе, если вы прошли данные, которые не доступны в вашем spreasdheet, ваш код будет возвращать значение -1 для rowWithSpaceNumber, который собирается привести к ошибке в var theRowData = sheetWithData.getSheetValues(rowWithSpaceNumber, 2, 1, 6); как -1 не является допустимым значением для строки.

+0

Спасибо за объяснения. Я планирую добавить ошибку, которая будет указывать что-то в строках «Место для парковки, которое вы указали, не является допустимым пробелом», чтобы уловить недопустимые пробелы. Затем, как узнать, когда данные являются объектом или строкой? –

+0

'typeof (v)' дает вам тип данных v. – rpm