0

我正在创建一个应用程序,可以帮助查找包含搜索查询的行并在 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 中的菜鸟,根本不知道如何赋予这个e参数功能。

先感谢您。

4

1 回答 1

0

e是一个具有多个属性的对象,对于任何 js 对象,您都应该告诉您要读取该对象的哪个属性。在此代码中,您想要的值是您在其中输入文本值的文本框的值,因此您需要做两件事:

  1. 给这个 textBox ( .setName('input')) 命名,这样你就可以在表单中使用这个相同的名称作为对象属性var inputValue = e.parameter.input
  2. 为此,文本框本身也必须是处理程序的 callbackElement 的一部分。您将表用作 callbackElement 但查询 textBox (input) 不是此表的子项,因此您可以通过某种方式将 textBox 添加到表中,或者在这种情况下可能更简单,将 textBox 添加为第二个回调元素,如下所示:

    handler.addCallbackElement(table).addCallbackElement(input);

你也可以看看这个简单的例子,它可以做你想要的。


编辑:可能的处理函数:

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;
}
于 2013-08-03T23:32:38.360 回答