2012-05-29 10 views
5

Estoy haciendo algunas búsquedas exhaustivas y necesito determinar si un nuevo dominio (URL) ya está en una hoja de cálculo. Sin embargo, ninguno de los objetos de la hoja de cálculo tiene funciones de búsqueda, es decir, findText() que se encuentra en la mayoría de los objetos de documento. Siento que me estoy perdiendo algo significativo. ¿Qué me estoy perdiendo?¿Cómo busco Google Spreadsheets?

función FINDTEXT: https://developers.google.com/apps-script/class_table#findText

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

hoja de cálculo objeto: https://developers.google.com/apps-script/class_sheet

Mi mejor conjetura es tratar de convertir la hoja de cálculo específica varía en las tablas del documento, a continuación, realizar la búsqueda. Mendokusai

+0

¿Podría proporcionarnos un poco más de información, como una sola hoja de cálculo, y las URL que se deben buscar en columnas específicas en cuántas hojas? Hay varias maneras de abordar el problema según el diseño. Insertar una tabla en un documento y luego buscar eso probablemente no sea la mejor manera de hacerlo. Si hay más de una hoja de cálculo, ¿están todas las hojas de cálculo en la misma carpeta? – ScampMichael

+0

Además, ¿necesita saber la ubicación de la url si se encuentra o simplemente que existe en la hoja de cálculo? – ScampMichael

Respuesta

2

Terminé usando fórmulas de hoja de cálculo para resolver mi problema. Específicamente, utilicé la función MATCH(), que puede buscar una cadena en una matriz (en este caso una columna en otra hoja en el mismo documento).

Esto es significativamente más simple que un bucle en una matriz, aunque es menos eficiente y no permite la automatización completa. De hecho, cuando la columna llegó a 2.000 entradas, Google Drive se congeló con tanta frecuencia que tuve que empezar a usar Excel en su lugar. Sin embargo, la solución Match() era más adecuada para lo que estaba buscando.

Sin embargo, apreciamos todas las demás respuestas.

4

Escribí una herramienta de búsqueda con una interfaz gráfica de usuario que realiza una búsqueda global en 3 columnas de una sola hoja. Se puede modificar fácilmente para adaptarse a sus necesidades. Supongo que sería una buena idea agregar un ancla en la interfaz de usuario para que pueda abrir la url que acaba de encontrar. Aquí está el código, esperando que te ayude a diseñar tu propia versión.

EDIT: He añadido el widget de anclaje en el código de abajo (que consigue su ref en la columna 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

Desafortunadamente no hay una funcionalidad de búsqueda en los servicios de hoja de cálculo. Puede obtener los datos para el rango que está buscando y luego iterar sobre él buscando una coincidencia. He aquí una función simple que hace que:

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

Por doloroso que parezca, esta es probablemente la única solución factible. – harvest316

+2

Abrí una solicitud de función para una función de búsqueda en hojas de cálculo. [3362] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=3362) – Jacobvdb

1

se puede "buscar" utilizando el parámetro de consulta feed listado SpreadsheetAPI. Esto devolverá cualquier fila que coincida con la coincidencia de palabras completas. Lanza algunos asteriscos alrededor de tu parámetro (URL codificada por supuesto) y se convierte en comodín.

Cuestiones relacionadas