1

情况:

  1. 1 个电子表格
  2. 多张纸
  3. 已选择 1 个单元格(可能会有所不同)

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

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

function FindSetFocus() 

{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var activecell = sheet.getActiveCell();
var valueactivecell = activecell.getValue();

//here comes the code :)

}

我在以下主题中找到了此代码段,但在设置输入和处理输出时遇到了一些问题:如何搜索 Google 电子表格?

我想我可以用'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;
}

也发现了这一点,但没有运气让它在选定的单元格上工作并设置焦点:如何在 Google 电子表格最佳答案中搜索并找到一行的坐标,第一个代码。

请记住,我不是专业编码人员 :) 如果提供了代码示例,请在行内发表评论,呵呵。

提前感谢您的帮助。

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

}
4

1 回答 1

6

这是一个这样的函数的例子,我在我的电子表格中插入了一个代表我分配脚本的按钮的图形,所以它很容易调用。

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

代码

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 开始迭代。但是在这种情况下,如果需要忽略初始起始单元格,那么您还应该记住它的坐标并在迭代中跳过这个值。

于 2013-10-19T11:03:28.253 回答