2012-05-29 10 views
5

Sto facendo alcune ricerche esaurienti e ho bisogno di determinare se un nuovo dominio (URL) è già in un foglio di calcolo. Tuttavia, nessuno degli oggetti Spreadsheet ha funzioni di ricerca, ovvero findText() trovato nella maggior parte degli oggetti Document. Mi sento come se mi mancasse qualcosa di significativo. Cosa mi manca?Come posso cercare in Google Spreadsheets?

funzione findText: oggetto https://developers.google.com/apps-script/class_table#findText

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

foglio di calcolo: https://developers.google.com/apps-script/class_sheet

La mia ipotesi migliore è cercare di convertire foglio di calcolo specifico varia nelle tabelle del documento, quindi eseguire la ricerca. Mendokusai

+0

Potrebbe fornire un po 'più di informazioni come è un singolo foglio di calcolo e gli URL da cercare in colonne specifiche in quanti fogli. Esistono diversi modi per affrontare il problema a seconda del layout. Inserimento di una tabella in un documento e quindi ricerca che probabilmente non è il modo migliore per andare. Se più di un foglio di calcolo sono tutti i fogli di calcolo nella stessa cartella? – ScampMichael

+0

Inoltre, è necessario conoscere la posizione dell'URL se viene trovata o solo che esiste nel foglio di calcolo? – ScampMichael

risposta

2

Alla fine ho usato le formule del foglio di calcolo per risolvere il mio problema. Nello specifico, ho usato la funzione MATCH(), che può cercare una stringa in un array (in questo caso una colonna in un altro foglio nello stesso documento).

Questo è significativamente più semplice del looping attraverso un array, sebbene sia meno efficiente e non consenta un'automazione completa. Infatti, quando la colonna ha raggiunto 2.000 voci, Google Drive si è bloccato così spesso che ho dovuto iniziare a utilizzare Excel. Tuttavia, la soluzione Match() era più appropriata per quello che stavo cercando.

Apprezzo comunque tutte le altre risposte.

4

Ho scritto uno strumento di ricerca con un'interfaccia grafica utente che esegue una ricerca globale in 3 colonne di un singolo foglio. Potrebbe essere facilmente modificato per soddisfare le tue esigenze. Immagino che sarebbe una buona idea aggiungere un'ancora nell'interfaccia utente per farti aprire l'URL che hai appena trovato. Ecco il codice, sperando che possa aiutarti a progettare la tua versione.

EDIT: ho aggiunto il widget di ancoraggio nel codice qui sotto (ottenendo la sua ref nella colonna 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 
8

Purtroppo non v'è alcuna funzionalità di ricerca nei servizi foglio di calcolo. È possibile ottenere i dati per l'intervallo in cui si sta effettuando la ricerca, quindi eseguirne l'iterazione alla ricerca di una corrispondenza. Ecco una semplice funzione che lo fa:

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

Per quanto possa sembrare doloroso, questa è probabilmente l'unica soluzione praticabile. – harvest316

+2

Ho aperto una richiesta di funzione per una funzione di ricerca sui fogli di lavoro. [3362] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=3362) – Jacobvdb

1

È possibile "cercare" utilizzando il parametro di query Feed elenco SpreadsheetAPI. Ciò restituirà qualsiasi riga corrispondente utilizzando la corrispondenza completa delle parole. Getta alcuni asterischi attorno al tuo parametro (ovviamente codificato nell'URL) e diventa jolly.

Problemi correlati