2012-05-29 2 views
5

몇 가지 철저한 검색을하고 있으며 새 도메인 (URL)이 이미 스프레드 시트에 있는지 확인해야합니다. 그러나 스프레드 시트 개체에는 대부분의 Document 개체에있는 findText()와 같은 검색 기능이 없습니다. 나는 중요한 무엇인가를 놓치고있는 것처럼 느낀다. 내가 무엇이 누락 되었습니까?Google 스프레드 시트를 검색하려면 어떻게해야합니까?

에는 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

내 추측이 다음 검색을 수행하려고 특정 스프레드 시트 문서 테이블에 범위를 변환하는 것입니다. Mendokusai

+0

하나의 스프레드 시트와 몇 개의 시트에서 특정 열에서 검색 할 URL과 같은 정보를 조금 더 제공 할 수 있습니까? 레이아웃에 따라 문제에 접근하는 데는 여러 가지 방법이 있습니다. 문서에 표를 삽입 한 다음이를 검색하는 것이 최선의 방법은 아닙니다. 두 개 이상의 스프레드 시트가있는 경우 모든 스프레드 시트가 같은 폴더에 있습니까? – ScampMichael

+0

또한 URL이 발견되거나 스프레드 시트에있는 경우 해당 URL의 위치를 ​​알아야합니까? – ScampMichael

답변

2

대신 스프레드 시트 수식을 사용하여 문제를 해결했습니다. 특히 배열 (이 경우 동일한 문서의 다른 시트에있는 열)에서 문자열을 찾을 수있는 MATCH() 함수를 사용했습니다.

이것은 효율적이지는 않지만 전체 자동화를 허용하지는 않지만 배열을 반복하는 것보다 훨씬 간단합니다. 실제로 열이 2,000 개 항목에 도달했을 때 Google 드라이브가 자주 사용되지 않아 대신 Excel을 사용해야했습니다. 그럼에도 불구하고 Match() 솔루션은 내가 찾고있는 것에 더 적합했습니다.

다른 모든 응답을 생각해보십시오.

4

필자는 단일 시트의 3 개 열에서 전역 검색을 수행하는 그래픽 사용자 인터페이스가 포함 된 검색 도구를 작성했습니다. 귀하의 필요에 맞게 쉽게 수정할 수 있습니다. 난 당신이 방금 발견 한 URL을 열 수 있도록 UI에 앵커를 추가하는 것이 좋습니다 것 같아요. 여기에 코드가 있습니다. 자신의 버전을 디자인하는 데 도움이되기를 바랍니다.

편집 : 나는 아래의 코드에서 앵커 위젯

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

불행하게도 스프레드 시트 서비스에는 검색 기능이 없다 (열 E에서의 심판을 받고) 추가. 검색하는 범위의 데이터를 가져온 다음 반복하여 일치하는 항목을 찾을 수 있습니다.

/** 
* 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 목록 피드 쿼리 매개 변수를 사용하여 "검색"할 수 있습니다 여기에 수행하는 간단한 함수입니다. 이렇게하면 전체 단어 일치를 사용하여 일치하는 행이 반환됩니다. 매개 변수 (물론 인코딩 된 URL) 주위에 별표를 몇 개 던지면 와일드 카드가됩니다.