2012-05-29 7 views
5

Ich mache ein paar erschöpfende Suchen und muss feststellen, ob sich bereits eine neue Domain (URL) in einer Tabelle befindet. Keines der Spreadsheet-Objekte verfügt jedoch über Suchfunktionen, nämlich findText(), das in den meisten Document-Objekten gefunden wird. Ich fühle mich, als würde ich etwas Bedeutendes vermissen. Was fehlt mir?Wie durchsuche ich Google Spreadsheets?

findtext Funktion: https://developers.google.com/apps-script/class_table#findText

Search Objekt: https://developers.google.com/apps-script/class_searchresult

Tabellenkalkulations-Objekt: https://developers.google.com/apps-script/class_sheet

Meine beste Vermutung ist, zu versuchen und zu konvertieren bestimmte Kalkulationstabelle reicht in Document Tabellen, dann führen Sie die Suche. Mendokusai

+0

Können Sie ein wenig mehr Informationen zur Verfügung stellen, wie zum Beispiel eine einzelne Tabelle und die URLs, die in bestimmten Spalten in der Anzahl der Blätter gesucht werden sollen. Es gibt eine Reihe von Möglichkeiten, das Problem abhängig vom Layout anzugehen. Wenn Sie eine Tabelle in ein Dokument einfügen und dann suchen, ist das wahrscheinlich nicht der beste Weg. Wenn mehrere Tabellen vorhanden sind, befinden sich alle Tabellen im selben Ordner? – ScampMichael

+0

Müssen Sie auch den Speicherort der URL kennen, wenn sie gefunden wird oder nur in der Tabelle vorhanden ist? – ScampMichael

Antwort

2

Ich endete mit Tabellenkalkulationsformeln, um mein Problem stattdessen zu lösen. Insbesondere habe ich die MATCH()-Funktion verwendet, die eine Zeichenfolge in einem Array nachschlagen kann (in diesem Fall eine Spalte in einem anderen Blatt im selben Dokument).

Dies ist wesentlich einfacher als das Durchlaufen eines Arrays, obwohl es weniger effizient ist und keine vollständige Automatisierung ermöglicht. In der Tat, als die Spalte 2.000 Einträge erreichte, fror Google Drive so oft ein, dass ich stattdessen Excel verwenden musste. Nichtsdestotrotz war die Match() Lösung besser geeignet für das was ich suchte.

Schätzen Sie alle anderen Antworten obwohl.

4

Ich schrieb ein Suchwerkzeug mit einer grafischen Benutzeroberfläche, die eine globale Suche in 3 Spalten eines einzelnen Blattes durchführt. Es könnte leicht modifiziert werden, um Ihren Bedürfnissen zu entsprechen. Ich denke, es wäre eine gute Idee, einen Anker in der Benutzeroberfläche hinzuzufügen, damit Sie die URL öffnen können, die Sie gerade gefunden haben. Hier ist der Code, in der Hoffnung, es wird Ihnen helfen, Ihre eigene Version zu entwerfen.

EDIT: ich der Anker-Widget in dem folgenden Code hinzugefügt (seine ref in Spalte E bekommen)

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

Leider keine Suchfunktionalität in der Kalkulationstabelle Diensten gibt. Sie können die Daten für den Bereich abrufen, in dem Sie suchen, und dann iterieren, um nach einer Übereinstimmung zu suchen. Hier ist eine einfache Funktion, die das tut:

+1

So schmerzvoll wie es scheint, ist dies wahrscheinlich die einzige praktikable Lösung. – harvest316

+2

Ich habe eine Feature-Anforderung für eine Suchfunktion in Kalkulationstabellen geöffnet. [3362] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=3362) – Jacobvdb

1

Sie können "suchen" mithilfe der SpreadSheetAPI List Feed Abfrageparameter. Dadurch wird eine Zeile zurückgegeben, die mit dem vollständigen Wortvergleich übereinstimmt. Wirf einige Sternchen um deinen Parameter herum (URL natürlich kodiert) und es wird Platzhalter.

Verwandte Themen