2012-05-29 34 views
5

我正在做一些詳盡的搜索,並需要確定一個新的域(URL)是否已經在電子表格中。但是,沒有任何電子表格對象具有搜索功能,即在大多數Document對象中找到的findText()。我覺得我失去了一些重要的東西。 我錯過了什麼?如何搜索Google Spreadsheets?

FINDTEXT功能:https://developers.google.com/apps-script/class_table#findText

信息搜索結果的對象:https://developers.google.com/apps-script/class_searchresult

電子表格對象:https://developers.google.com/apps-script/class_sheet

我最好的猜測是嘗試和轉換特定的電子表格文檔中的表格範圍,然後進行搜索。 Mendokusai

+0

您能否提供更多信息,例如它是單個電子表格,還是要在特定列中搜索多少張圖片的網址。取決於佈局,有許多方法可以解決問題。將表格插入文檔然後搜索可能不是最好的方法。如果有多個電子表格,那麼所有電子表格都在同一個文件夾中? – ScampMichael

+0

另外,你是否需要知道URL的位置,如果它被發現或只是它存在於電子表格中? – ScampMichael

回答

2

我最終使用電子表格公式來解決我的問題。具體來說,我使用MATCH()函數,它可以查找數組中的字符串(在本例中是同一文檔中另一個表中的列)。

這比在數組中循環顯着簡單,雖然效率較低並且不允許完全自動化。實際上,當該列達到2000條時,Google Drive會經常凍結,我不得​​不開始使用Excel。不過,Match()解決方案更適合我所需要的。

雖然欣賞所有其他答案。

4

我用一個圖形用戶界面編寫了一個搜索工具,可以在單張紙的3列中執行全局搜索。它可以很容易地修改,以適應您的需求。我想這將是一個好主意,在UI中添加一個錨點,讓你打開你剛剛找到的網址。 這裏是代碼,希望它能幫助你設計你自己的版本。

編輯:我添加以下代碼錨部件(獲取其列E REF)

// 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 
8

不幸的是,在電子表格服務沒有搜索功能。您可以獲取正在搜索的範圍的數據,然後遍歷它尋找匹配。這是一個簡單的功能:

/** 
* 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; 
} 
+1

儘管看起來很痛苦,但這可能是唯一可行的解​​決方案。 – harvest316

+2

我在電子表格中打開了查找功能的功能請求。 [3362](https://code.google.com/p/google-apps-script-issues/issues/detail?id=3362) – Jacobvdb

1

您可以使用SpreadsheetAPI列表Feed查詢參數進行「搜索」。這將返回任何匹配使用全字匹配的行。在你的參數(當然是URL編碼)周圍放一些星號,它就變成了通配符。