使用谷歌脚本在电子表格中查找价值

时间:2013-10-18 19:13:07

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

情况:

  1. 1电子表格
  2. 多张
  3. 选择1个单元格(可能会有所不同)
  4. 我想要做的是在点击电子表格中的类似按钮的图像时,找到并将焦点设置到与所选单元格匹配的任何工作表中的下一个单元格(不区分大小写)。有点像MS Word可以为您创建的自定义索引。

    我的方法是: - 将所选单元格的值设置为变量(成功) - 找到匹配该变量的第一个单元格(不是所选单元格)(不成功) - 将找到的单元格的值设置为variable2(不成功) - 将电子表格的焦点设置为变量2(不成功)

    function FindSetFocus() 
    
    {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    var activecell = sheet.getActiveCell();
    var valueactivecell = activecell.getValue();
    
    //here comes the code :)
    
    }
    

    我在以下主题中找到了这个片段,但是我在设置输入和使用输出执行某些操作时遇到了一些麻烦:How do I search Google Spreadsheets?

    我认为我可以用'valueactivecell'替换'value',但我不知道如何设置搜索电子表格中所有工作表的范围。此外,我希望输出是我可以设置的重点,使用像'ss.setActiveSheet(sheet).setActiveSelection(“D5”);'

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

    也找到了这个,但没有好运让它在所选单元格上工作并设置焦点:How do I search for and find the coordinates of a row in Google Spreadsheets最佳答案,第一个代码。

    请记住,我不是专业编码人员:)如果提供了代码示例,请在线注释嘿嘿。

    提前感谢您的帮助。

    编辑24/10:使用下面答案中的代码编辑了一下。现在,您可以在电子表格中查看多个工作表以查找值。此位的唯一问题是:我的单元格突出显示为黄色,但未找到具有找到值的单元格。请参阅下面的代码以跳过表格。我无法理解这一点:)

    function SearchAndFind() {
    
    //determine value of selected cell
    var sh = SpreadsheetApp.getActiveSpreadsheet();
    var ss = sh.getActiveSheet();
    var cell = ss.getActiveCell();
    var value = cell.getValue();
    
    //create array with sheets in active spreadsheet
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
    
    //loop through sheets to look for value
    for (var i in sheets) {
    
     //Set active cell to A1 on each sheet to start looking from there
      SpreadsheetApp.setActiveSheet(sheets[i])
      var sheet = sh.getActiveSheet();
      var range = sheet.getRange("A1");
      sheet.setActiveRange(range);
    
    //set variables to loop through data on each sheet
      var activeR = cell.getRow()-1;
      var activeC = cell.getColumn()-1;
      var data = sheets[i].getDataRange().getValues()
      var step = 0
    
    //loop through data on the sheet  
      for(var r=activeR;r<data.length;++r){
        for(var c=activeC;c<data[0].length;++c){
          step++
          Logger.log(step+' -- '+value+'  =  '+data[r][c]);
          if(data[r][c]==''||step==1){ continue };
          if(value.toString().toLowerCase()==data[r][c].toString().toLowerCase()){
             sheet.getRange(r+1,c+1).activate().setBackground('#ffff55');
            return;
          }
        }
      }
     }
    
    }
    

1 个答案:

答案 0 :(得分:3)

这是一个这样一个函数的例子,我在电子表格中插入了一个绘图,表示我分配了脚本的按钮,因此很容易调用。

我添加了一个功能,可以在生成的选定单元格上设置浅黄色背景,这样就可以更容易地看到所选单元格,但这是可选的。

代码

function findAndSelect(){
  var sh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sh.getActiveSheet();
  var cell = ss.getActiveCell();
  cell.setBackground('#ffff55');// replace by cell.setBackground(null); to reset the color when "leaving" the cell
  var activeR = cell.getRow()-1;
  var activeC = cell.getColumn()-1;
  var value = cell.getValue();
  var data = ss.getDataRange().getValues();
  var step = 0
  for(var r=activeR;r<data.length;++r){
    for(var c=activeC;c<data[0].length;++c){
      step++
      Logger.log(step+' -- '+value+'  =  '+data[r][c]);
      if(data[r][c]==''||step==1){ continue };
      if(value.toString().toLowerCase()==data[r][c].toString().toLowerCase()){
        ss.getRange(r+1,c+1).activate().setBackground('#ffff55');
        return;
      }
    }
  }
}

买者

此代码仅搜索“向下”,即忽略在所选单元格之前的行中出现的任何事件,对于列... ...

如果这对您来说是个问题,则应修改代码以从0开始迭代。但是在这种情况下,如果需要忽略初始起始单元格,那么您还应该记住其坐标并在迭代中跳过此值。