【问题标题】:Search spreadsheet by column, return rows按列搜索电子表格,返回行
【发布时间】:2013-08-28 07:49:54
【问题描述】:

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

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

【问题讨论】:

  • 代码胜于雄辩。您可以发布您拥有的代码吗?如果你已经写了一些东西开始,我们可以帮助优化
  • 谢谢,你的问题引导我回答我的问题.. :)

标签: search google-apps-script google-sheets


【解决方案1】:

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

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;
} 

【讨论】:

  • 你能解释一下在哪里可以找到“findIndex”函数吗?官方文档中看不到这个功能
  • @Aseem gautam。我想检查列中的项目数组。我如何使用您的函数来找出列中是否不存在这些数组项,然后如果它们不存在则插入它们?
【解决方案2】:

您可能想要使用 Google Apps 脚本 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)
}

【讨论】:

  • 请注意,此解决方案不会按照问题中的要求在特定列中进行搜索。它搜索整个电子表格。
  • @Emin 该函数在一个范围内搜索。该范围可以是一列或任何您想要的。为该单列创建范围并将sheet.createTextFinder() 替换为range.createTextFinder()
【解决方案3】:

My lookup script on 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” - 如果您将结果设置为电子表格而不将其返回到内存中,则它将设置“SetSheetRange”中的第一个单元格,并注明内容和时间。

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

【讨论】:

    【解决方案4】:

    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 的数字部分应该匹配。

    【讨论】:

      【解决方案5】:
      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;
      } 
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        相关资源
        最近更新 更多