【问题标题】:How do I search Google Spreadsheets?如何搜索 Google 电子表格?
【发布时间】:2012-06-04 04:41:21
【问题描述】:

我正在做一些详尽的搜索,并且需要确定新域 (URL) 是否已经在电子表格中。但是,没有一个 Spreadsheet 对象具有搜索功能,即在大多数 Document 对象中都可以找到 findText()。我觉得我错过了一些重要的东西。 我错过了什么?

findText 函数:https://developers.google.com/apps-script/class_table#findText

SearchResult 对象:https://developers.google.com/apps-script/class_searchresult

电子表格对象:https://developers.google.com/apps-script/class_sheet

我最好的猜测是尝试转换文档表中的特定电子表格范围,然后执行搜索。门德斋

【问题讨论】:

  • 您能否提供更多信息,例如它是否是一个电子表格,以及要在多少张表格中的特定列中搜索的网址。根据布局,有多种方法可以解决问题。将表格插入文档然后进行搜索可能不是最好的方法。如果有多个电子表格,所有电子表格是否都在同一个文件夹中?
  • 另外,如果找到 url,您是否需要知道它的位置,或者只是它存在于电子表格中?

标签: search spreadsheet google-apps-script


【解决方案1】:

我编写了一个带有图形用户界面的搜索工具,它在单张纸的 3 列中执行全局搜索。它可以很容易地修改以满足您的需要。我想在 UI 中添加一个锚点以让您打开刚刚找到的 url 是个好主意。 这是代码,希望它可以帮助您设计自己的版本。

编辑:我在下面的代码中添加了锚小部件(在 E 列中获取它的引用)

// 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(130).setWidth(400);
  app.setTitle("Search by name / lastname / adress");
  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("Lastname").setWidth("120");
  var label3=app.createLabel("Street").setWidth("120");
  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("120");
  var hpanel2 = app.createHorizontalPanel();
  hpanel2.add(txt0).add(txt1).add(txt2).add(txt3)
  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(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 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(2,2,lastrow,4).getValues();// get the 4 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 4 fields, break the loop and show results
          txt0.setText(nn+2);
          txt1.setText(data[nn][0]).setStyleAttribute("background", "cyan");
          txt2.setText(data[nn][1]);
          txt3.setText(data[nn][2]);
          link.setText(data[nn][3]).setHref(data[nn][3]);
          sh.getRange(nn+2,2).activate();
          subbtn.setText("found '"+item+"' in row "+Number(nn+2)+", 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(2,2,lastrow,4).getValues();// get the 4 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+2);
          txt1.setText(data[nn][0]).setStyleAttribute("background", "cyan");
          txt2.setText(data[nn][1]);
          txt3.setText(data[nn][2]);
          link.setText(data[nn][3]).setHref(data[nn][3])
          sh.getRange(nn+2,2).activate();
          subbtn.setText("found '"+item+"' in row "+Number(nn+2)+", next ?");                                                                                               
          hidden.setValue(nn.toString())                                                                                  
          break
          }
      }
return app    ;// update UI
}// eof 05-12 Serge insas

【讨论】:

    【解决方案2】:

    很遗憾,电子表格服务中没有搜索功能。您可以获取您正在搜索的范围的数据,然后对其进行迭代以寻找匹配项。这是一个简单的函数:

    /**
     * Finds a value within a given range. 
     * @param value The value to find.
     * @param range The range to search in.
     * @return A range pointing to the first cell containing the value, 
     *     or null if not found.
     */
    function find(value, range) {
      var data = range.getValues();
      for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < data[i].length; j++) {
          if (data[i][j] == value) {
            return range.getCell(i + 1, j + 1);
          }
        }
      }
      return null;
    }
    

    【讨论】:

    • 虽然看起来很痛苦,但这可能是唯一可行的解​​决方案。
    • 我为电子表格上的查找功能打开了一个功能请求。 3362
    【解决方案3】:

    您可以使用 SpreadsheetAPI List Feed 查询参数“搜索”。这将返回使用全字匹配匹配的任何行。在你的参数周围加上一些星号(当然是 URL 编码的),它就变成了通配符。

    【讨论】:

      【解决方案4】:

      我最终改用电子表格公式来解决我的问题。具体来说,我使用了MATCH() 函数,它可以在数组中查找字符串(在本例中是同一文档中另一张表中的列)。

      这比遍历数组要简单得多,但效率较低且不允许完全自动化。事实上,当该列达到 2,000 个条目时,Google Drive 经常冻结,我不得​​不开始使用 Excel。不过,Match() 解决方案更适合我的需求。

      感谢所有其他回复。

      【讨论】:

        【解决方案5】:

        我还没有尝试过,但似乎Google Visualization API Query Language 将允许您对 Google 表格执行 SQL 查询。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          相关资源
          最近更新 更多