21

我正在尝试在运行时方面找到最佳脚本来完成任务。我有一个相当大的电子表格,我需要检查某些已知列中的值,并根据匹配情况返回该行。理想情况下,我想要一个包含返回行的新电子表格。

我已经通过 ID 打开了电子表格,并且已经获得了工作表和范围,但不确定搜索特定列并不仅获取该值而且获取整行的最有效方法。

4

5 回答 5

53

您可以使用下面的代码在特定列中进行搜索。代码是不言自明的。

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [ {name: "Search", functionName: "onSearch"} ];
  ss.addMenu("Commands", menuEntries);    
}

function onSearch()
{
    var searchString = "Test11";
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SheetName"); 
    var column =4; //column Index   
    var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
    var searchResult = columnValues.findIndex(searchString); //Row Index - 2

    if(searchResult != -1)
    {
        //searchResult + 2 is row index.
        SpreadsheetApp.getActiveSpreadsheet().setActiveRange(sheet.getRange(searchResult + 2, 1))
    }
}

Array.prototype.findIndex = function(search){
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if (this[i] == search) return i;

  return -1;
} 
于 2013-08-28T08:19:14.953 回答
16

您可能想要使用 Google Apps Script textFinder类。

此示例函数将搜索字符串并在警报对话框中显示第一次出现的行:

function searchString(){
  var sheet = SpreadsheetApp.getActiveSheet()
  var search_string = "dog"
  var textFinder = sheet.createTextFinder(search_string)
  var search_row = textFinder.findNext().getRow()
  var ui = SpreadsheetApp.getUi();
  ui.alert("search row: " + search_row)
}
于 2019-04-20T00:53:21.517 回答
0

我在 GitHub 上的查找脚本

用途:

Lookup_(SheetinfoArray,"Sheet1!A:B",0,[1],"Sheet1!I1","n","y","n");

Lookup_(Sheetinfo,"Sheet1!A:B",0,[1],"return","n","n","y");

Lookup_(SheetinfoArray,"Sheet1!A:B",0,[0,1],"return","n","n","y");

Lookup_(Sheetinfo,"Sheet1!A:B",1,[1,3,0,2],"return","y","n","n");

Lookup_("female","Sheet1!A:G",4,[2],"Database!A1","y","y","y");

Lookup_(Sheetinfo,LocationsArr,4,[0],"return","y","n","y");

Lookup_(/RegEx+/i,LocationsArr,4,[0],"return","y","n","y");

///////////////////////////////////////// /////

参数说明:

-"Search_Key" - 可以是字符串、数组或正则表达式以一次查找多个内容

-“RefSheetRange” - 信息的参考来源。可以是本地工作表引用和范围或来自变量的数据数组。

-“SearchKey_RefMatch_IndexOffSet” - 您将“Search_Key”引用到“RefSheetRange”数据的信息列。

-“IndexOffSetForReturn”-一旦找到“Search_Key”匹配项,将从“RefSheetRange”返回哪些数据列。

-“SetSheetRange”-您要将与“Search_Key”匹配的“RefSheetRange”中选择的信息放在哪里,或者您可以使用“return”,当函数完成时它将返回,以便您可以将函数输出到变量。

-“ReturnMultiResults” - 如果“Y”假设“Search_Key”是“NW”,并且您想在数据集中找到位于西北下方的连锁店中的每家商店。因此,在找到第一个匹配项后声明“Y”不会停止,它将继续搜索其余数据。

-“Add_Note” - 如果“Y”将结果设置为电子表格而不将其返回到内存,那么它将设置“SetSheetRange”中的第一个单元格,并注明内容和时间。

-“Has_NAs” - 如果是“Y”,它将在“#N/A”列中没有找到“Search_Key”的数据,否则它将将该列留空。

于 2018-02-04T08:46:54.860 回答
0

INDEX 和 MATCH 的组合应该起作用:

=INDEX($B$2:$D$1000,MATCH(S2,$A$2:$A$1000,0))

S2 是搜索关键字。

$A$2:$A$1000 是一个范围,我们将在其中查找。

$B$2:$D$1000 是一个范围,我们将返回。

请记住,$B$2:$D$1000 和 $A$2:$A$1000 的数字部分应该匹配。

于 2021-01-11T23:52:42.293 回答
-1
function onSearch()
{
    var searchString = "SD0023";
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); 
    var column =1; //column Index   
    var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
    var searchResult = columnValues.findIndex(searchString); //Row Index - 2

    if(searchResult != -1)
    {
        //searchResult + 2 is row index.
        SpreadsheetApp.getActiveSpreadsheet().setActiveRange(sheet.getRange(searchResult + 2, 3)).setValue("found here");
    }
}

Array.prototype.findIndex = function(search){
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if (this[i].toString().indexOf(search) > -1 ) return i;

  return -1;
} 

对搜索内联文本的答案进行了一些小改动。

于 2015-04-09T18:38:12.003 回答