我正在创建一个应用程序,可以帮助查找包含搜索查询的行并在Ui中显示结果。我已经编写了这段代码,但有些东西可能有问题而且不起作用:
// Global variables
var sh = SpreadsheetApp.getActiveSheet();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var lastrow = ss.getLastRow();
var lastcol = ss.getLastColumn();
// Menu additions
function onOpen() {
var menuEntries = [{name: 'search', functionName: 'ui'}];
ss.addMenu('Ui',menuEntries);
}
// UI
function ui() {
var app = UiApp.createApplication().setHeight('400').setWidth('900').setTitle('UI');
var panel = app.add(app.createHorizontalPanel());
var input = panel.createTextBox().setId('input').setFocus(true);
panel.add(input).add(printBtn).add(saveBtn).add(emailBtn);
var table = app.createFlexTable().setId('table').setBorderWidth(1).setCellPadding(1);
var handler = app.createServerHandler('search');
input.addChangeHandler(handler);
handler.addCallbackElement(table);
app.add(table);
ss.show(app);
}
function search(e) {
var app = UiApp.getActiveApplication();
var table = app.getElementById('table');
var query = e.toLowerCase();
var data = sh.getRange(2,1,lastrow,lastcol).getValues();
for (var row = 1; row < data.length; row++) {
for (var col = 0; col < data[row].length; col++) {
if(data[row][col].toString().toLowerCase().match(e.toString()) == e.toString() && e != '');
table.setText(row, col, data[row][col].toString());
}
}
return app;
}
调试器表示函数的搜索中的对象 e 未定义。另外我在js中绝对是noob而根本不知道如何让这个 e 参数起作用。
提前谢谢。
答案 0 :(得分:0)
e
是一个具有多个属性的对象,对于任何js对象,您应该告诉您要读取此对象的哪个属性。在此代码中,您需要的值是textBox的值,您可以在其中输入文本值,因此您需要做两件事:
.setName('input')
)命名,以便您可以使用与var inputValue = e.parameter.input
为了使其工作,textBox本身也必须是处理程序的callbackElement的一部分。你使用你的表作为callbackElement,但查询textBox(输入)不是这个表的子项,所以你可以在某种程度上将textBox添加到表中,或者在这种情况下可能更简单,添加textBox作为第二个回调元素,如下所示:
handler.addCallbackElement(table).addCallbackElement(input)
;
您还可以查看this simple example,它大致可以满足您的需求。
编辑:可能的处理函数 :
function search(e) {
var app = UiApp.getActiveApplication();
var table = app.getElementById('table');
var query = e.parameter.input.toLowerCase();
var tableRow = 0 ;
var data = sh.getRange(2,1,lastrow,lastcol).getValues();
for (var row = 1; row < data.length; row++) {
for (var col = 0; col < data[row].length; col++) {
if(data[row][col].toString().toLowerCase().match(query) == query && query!= ''){
for(c=0 ; c<data[row].length;++c){
table.setText(tableRow, c, data[row][c].toString());
}
++tableRow
continue;
}
}
}
return app;
}