添加更多文本字段

时间:2013-01-23 21:40:42

标签: javascript google-apps-script google-sheets

我在此处找到的电子表格中有一个搜索脚本。我理解其中的大部分但不是全部。我想要的是添加更多显示该数据的文本框。我尝试添加以下行,但我得到TypeError: Cannot call method "add" of undefined. (line 41)

第41行包含hpanel3.add(label4).add(label5).add(label6).add(label7)这只是具有不同数字的上述代码的副本。脚本无需这些行即可工作。

// G. Variables
var sh = SpreadsheetApp.getActiveSheet();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var lastrow = ss.getLastRow();
//
function onOpen() {
  var menuEntries = [ {name: "Search GUI", functionName: "searchUI"},
                     ];
  ss.addMenu("Search Utilities",menuEntries);// custom menu
}
// Build a simple UI to enter search item and show results + activate result's row
function searchUI() {
  var app = UiApp.createApplication().setHeight(200).setWidth(600);
  app.setTitle("Search by anything");
  var panel = app.createVerticalPanel();
  var txtBox = app.createTextBox().setFocus(true);
  var label=app.createLabel(" Item to search for :")
  panel.add(label);
  txtBox.setId("item").setName("item");
//
  var label0=app.createLabel("Row").setWidth("40");
  var label1=app.createLabel("Name").setWidth("120");
  var label2=app.createLabel("ID").setWidth("120");
  var label3=app.createLabel("Street").setWidth("200");
  var hpanel = app.createHorizontalPanel();
  hpanel.add(label0).add(label1).add(label2).add(label3)
//
  var txt0=app.createTextBox().setId("lab0").setName("0").setWidth("40");
  var txt1=app.createTextBox().setId("lab1").setName("txt1").setWidth("120");
  var txt2=app.createTextBox().setId("lab2").setName("txt2").setWidth("120");
  var txt3=app.createTextBox().setId("lab3").setName("txt3").setWidth("250");
  var hpanel2 = app.createHorizontalPanel();
  hpanel2.add(txt0).add(txt1).add(txt2).add(txt3)
//                   
//
//  var label4=app.createLabel("Phone").setWidth("120");
//  var label5=app.createLabel("Pet Name").setWidth("120");
//  var label6=app.createLabel("Breed").setWidth("120");
//  var label7=app.createLabel("Gender").setWidth("120");
//  var hpanel = app.createHorizontalPanel();
//  hpanel3.add(label4).add(label5).add(label6).add(label7)
////
//  var txt4=app.createTextBox().setId("lab4").setName("txt4").setWidth("40");
//  var txt5=app.createTextBox().setId("lab5").setName("txt5").setWidth("120");
//  var txt6=app.createTextBox().setId("lab6").setName("txt6").setWidth("120");
//  var txt7=app.createTextBox().setId("lab7").setName("txt7").setWidth("250");
//  var hpanel3 = app.createHorizontalPanel();
//  hpanel4.add(txt4).add(txt5).add(txt6).add(txt7)
//
  var hidden = app.createHidden().setName("hidden").setId("hidden");
  var subbtn = app.createButton("next ?").setId("next").setWidth("250");
  var link = app.createAnchor('', '').setId('link');
  panel.add(txtBox);
  panel.add(subbtn);
  panel.add(hidden);
  panel.add(hpanel);
  panel.add(hpanel2);
//  panel.add(hpanel3);
//  panel.add(hpanel4);
  panel.add(link);
  var keyHandler = app.createServerHandler("click");
  txtBox.addKeyUpHandler(keyHandler)
  keyHandler.addCallbackElement(panel);
//
  var submitHandler = app.createServerHandler("next");
  subbtn.addClickHandler(submitHandler);
  submitHandler.addCallbackElement(panel);
//
  app.add(panel);  
  ss.show(app);
  }
//
function click(e){
   var row=ss.getActiveRange().getRowIndex();              
   var app = UiApp.getActiveApplication();
   var txtBox = app.getElementById("item");
   var subbtn = app.getElementById("next").setText("next ?")      
   var txt0=app.getElementById("lab0").setText('--');
   var txt1=app.getElementById("lab1").setText('no match').setStyleAttribute("background", "white");// default value to start with
   var txt2=app.getElementById("lab2").setText('');
   var txt3=app.getElementById("lab3").setText('');     
//   var txt4=app.getElementById("lab4").setText('');
//   var txt5=app.getElementById("lab5").setText('');
//   var txt6=app.getElementById("lab6").setText('');
//   var txt7=app.getElementById("lab7").setText('');
   var link=app.getElementById('link').setText('').setHref('')
   var item=e.parameter.item.toLowerCase(); // item to search for
   var hidden=app.getElementById("hidden")                  
   var data = sh.getRange(3,1,lastrow,18).getValues();// get the 18 columns of data
       for(nn=0;nn<data.length;++nn){ ;// iterate trough
         if(data[nn].toString().toLowerCase().match(item.toString())==item.toString()&&item!=''){;// if a match is found in one of the 18 fields, break the loop and show results
          txt0.setText(nn+3);
          txt1.setText(data[nn][0]).setStyleAttribute("background", "cyan");
          txt2.setText(data[nn][2]);
          txt3.setText(data[nn][4]);
//          txt4.setText(data[nn][5]);
//          txt5.setText(data[nn][6]);
//          txt6.setText(data[nn][7]);
//          txt7.setText(data[nn][8]);
          link.setText(data[nn][0]).setHref(data[nn][0]);
          sh.getRange(nn+3,1).activate();
          subbtn.setText("found '"+item+"' in row "+Number(nn+3)+", next ?");
          hidden.setValue(nn.toString())                                                                                  
          break
          }
      }
return app    ;// update UI
}
function next(e){
   var row=ss.getActiveRange().getRowIndex();              
   var app = UiApp.getActiveApplication();
   var txtBox = app.getElementById("item");
   var subbtn = app.getElementById("next").setText("no other match")      
   var hidden=app.getElementById("hidden");                  
   var start=Number(e.parameter.hidden)+1;//returns the last search index stored in the UI
   var item=e.parameter.item.toLowerCase(); // item to search for
   var txt0=app.getElementById("lab0");
   var txt1=app.getElementById("lab1").setStyleAttribute("background", "yellow");
   var txt2=app.getElementById("lab2");
   var txt3=app.getElementById("lab3");
   var link=app.getElementById('link').setText('').setHref('')
   var data = sh.getRange(3,1,lastrow,18).getValues();// get the 18 columns of data
       for(nn=start;nn<data.length;++nn){ ;// iterate trough
         if(data[nn].toString().toLowerCase().match(item.toString())==item.toString()&&item!=''){;// if a match is found in one of the 4 fields, break the loop and show results
          txt0.setText(nn+3);
          txt1.setText(data[nn][0]).setStyleAttribute("background", "cyan");
          txt2.setText(data[nn][2]);
          txt3.setText(data[nn][4]);
          link.setText(data[nn][0]).setHref(data[nn][0])
          sh.getRange(nn+3,1).activate();
          subbtn.setText("found '"+item+"' in row "+Number(nn+3)+", next ?");                                                                                               
          hidden.setValue(nn.toString())                                                                                  
          break
          }
      }
return app    ;// update UI
}

任何帮助都非常有吸引力。就像我说的那样,我理解了很多事情,但我永远无法从头开始。这是一份狗牌照清单。我是一名动物管制官,当我找到一只流浪狗时,我的调度员会用它来找到狗的主人而不必前往避难所。

1 个答案:

答案 0 :(得分:1)

“已定义”表示已为当前范围中的变量赋予值。如果您正在调试器中观察,您将看到范围内“声明”的所有变量,即使它们尚未定义。

您对各种hpanel的定义发生在错误的顺序中。在第41行,您还没有定义hpanel3。 (错误消息不是骗你的!)看来你打算在第40行定义它,而是重新定义 hpanel

稍后,第47行定义hpanel3,但第48行尝试分配给尚未定义的hpanel4。这会产生同样的错误。

顺便说一下,你不需要把评论放在空白行上......它们可以是空白的。