Вопрос по search, google-apps-script, spreadsheet – Как искать в таблицах Google?

6

Я делаю несколько исчерпывающих поисков и мне нужно определить, есть ли новый домен (URL) уже в электронной таблице. Однако ни один из объектов электронной таблицы не имеет функций поиска, а именно findText (), найденных в большинстве объектов Document. Я чувствую, что мне не хватает чего-то значительного. Что мне не хватает?

функция 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

Кроме того, вам нужно знать местоположение URL-адреса, если он найден, или он существует только в электронной таблице? ScampMichael
Не могли бы вы предоставить немного больше информации, например, является ли она одной электронной таблицей, и являются ли URL-адреса для поиска в определенных столбцах в количестве листов. Существует несколько способов решения проблемы в зависимости от макета. Вставка таблицы в документ и последующий поиск, вероятно, не лучший способ. Если несколько таблиц, все ли таблицы находятся в одной папке? ScampMichael

Ваш Ответ

5   ответов
4

который выполняет глобальный поиск в 3 столбцах одного листа. Он может быть легко изменен в соответствии с вашими потребностями. Я думаю, что было бы неплохо добавить привязку в пользовательском интерфейсе, чтобы позволить вам открыть 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
0

Язык запросов API визуализации Google позволит вам выполнять запросы SQL против листов Google.

3

лемы. В частности, я использовалMATCH() функция, которая может искать строку в массиве (в данном случае столбец на другом листе в том же документе).

Это значительно проще, чем циклически проходить по массиву, но менее эффективно и не обеспечивает полной автоматизации. Фактически, когда в столбце было 2000 записей, Google Drive так часто зависал, что мне пришлось вместо этого начать использовать Excel. Тем не менее, решение Match () было более подходящим для того, что я искал.

Оцените все другие ответы, хотя.

9

в службах электронных таблиц нет функции поиска. Вы можете получить данные для диапазона, в котором вы ищете, а затем перебрать его в поисках совпадения. Вот простая функция, которая делает это:

/**
 * 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;
}
Как бы болезненно это ни казалось, это, пожалуй, единственное работоспособное решение.
Я открыл запрос на функцию поиска в электронных таблицах.3362
1

искать & quot; используя параметр запроса SpreadsheetAPI List Feed. Это вернет любую строку, которая соответствует полному совпадению слов. Добавьте несколько звездочек вокруг вашего параметра (URL, закодированный, конечно), и он станет подстановочным знаком.

Похожие вопросы