2012-05-29 25 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

単一のスプレッドシートであり、いくつのシートの特定の列で検索されるかなど、より多くの情報を提供できますか?レイアウトに応じて問題にアプローチする方法はいくつかあります。ドキュメントにテーブルを挿入し、それを検索するのはおそらく最善の方法ではありません。複数のスプレッドシートの場合は、すべて同じスプレッドシートですか? – ScampMichael

+0

また、URLが見つかった場合、またはスプレッドシートに存在するURLの場所を知る必要がありますか? – ScampMichael

答えて

2

代わりに私の問題を解決するためにスプレッドシートの公式を使用しました。具体的には、MATCH()関数を使用しました。この関数は、配列内の文字列(この場合は同じドキュメント内の別のシートの列)を検索できます。

これは、アレイのループ処理よりもはるかに簡単ですが、効率は低下しますが完全自動化はできません。実際、列が2,000件に達したときにGoogleドライブが頻繁に凍ってしまったので、Excelを使い始める必要がありました。それにもかかわらず、Match()ソリューションは、私が探していたものに適していました。

しかし、他のすべての回答を鑑賞してください。

4

私は、単一のシートの3列でグローバル検索を実行するグ​​ラフィカルユーザーインターフェイスを備えた検索ツールを作成しました。あなたのニーズに合わせて簡単に修正することができます。 UIでアンカーを追加して、あなたが見つけたばかりのURLを開くことをお勧めします。 ここにコードがあり、自分のバージョンを設計するのに役立つことを願っています。

編集:私は残念ながら、スプレッドシートのサービスには検索機能がありません(列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

をアンカーウィジェットを追加しました。検索している範囲のデータを取得し、それを繰り返して一致するものを探します。

/** 
* 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 List Feedクエリパラメータを使用して「検索」することができます。これは、完全な単語マッチングを使用して一致する行を返します。あなたのパラメータの周りにいくつかのアスタリスクを投げてください(URLはもちろんコード化されています)、それはワイルドカードになります。

関連する問題