Search 使用Google脚本在电子表格中的任何表格上查找值

Search 使用Google脚本在电子表格中的任何表格上查找值,search,google-apps-script,find,spreadsheet,Search,Google Apps Script,Find,Spreadsheet,使用下面的代码,我可以查看电子表格中的多个表格,找到与所选单元格相等的第一个值。该位唯一的问题是:具有找到的值的单元格高亮显示为黄色,但未选择具有找到的值的单元格。请参阅下面的代码,了解如何在图纸中跳转。我无法理解这一点:) 有趣的是,当我没有在工作表列表中跳转时,高亮显示和选择值的代码确实起作用,请参见最佳答案: 函数SearchAndFind(){ //确定所选单元格的值 var sh=SpreadsheetApp.getActiveSpreadsheet(); var ss=sh.getA

使用下面的代码,我可以查看电子表格中的多个表格,找到与所选单元格相等的第一个值。该位唯一的问题是:具有找到的值的单元格高亮显示为黄色,但未选择具有找到的值的单元格。请参阅下面的代码,了解如何在图纸中跳转。我无法理解这一点:)

有趣的是,当我没有在工作表列表中跳转时,高亮显示和选择值的代码确实起作用,请参见最佳答案:

函数SearchAndFind(){
//确定所选单元格的值
var sh=SpreadsheetApp.getActiveSpreadsheet();
var ss=sh.getActiveSheet();
var cell=ss.getActiveCell();
var value=cell.getValue();
//使用活动电子表格中的图纸创建阵列
var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets();
//在表格中循环查找值
用于(表中的var i){
//将每张图纸上的“活动单元格”设置为A1,以便从此处开始查看
电子表格app.setActiveSheet(表格[i])
var sheet=sh.getActiveSheet();
var范围=表1.getRange(“A1”);
表.setActiveRange(范围);
//将变量设置为循环遍历每张图纸上的数据
var activeR=cell.getRow()-1;
var activeC=cell.getColumn()-1;
var data=sheets[i].getDataRange().getValues()
var步长=0
//循环浏览工作表上的数据

对于(var r=activeR;r此代码能够跨多个工作表进行搜索,它显然基于您发布的代码,但在从一个工作表更改到下一个工作表时使用内存(scriptProperties)保持搜索值“活动”,并知道何时搜索它。 它有两个非最佳方面:1°在开始新的搜索之前,您必须一直搜索到最后一次出现。 2°:当它从活页n切换到活页n+1时,它首先选择单元格A1,然后再查找出现的值

我想应该可以解决这些问题,但现在我不知道如何解决:-) 也许这个方法不是最好的,我从一个简单的单页脚本开始修改和复杂化…这通常不是最好的开发策略(我知道),但无论如何,这是一个有趣的实验和一个很好的逻辑练习。。。 谢谢你

function SearchAndFind() {

  //determine value of selected cell
  var sh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sh.getActiveSheet();
  var cell = ss.getActiveCell();
  var value = cell.getValue();
  if(ScriptProperties.getProperty('valueToFind')!=''){value = ScriptProperties.getProperty('valueToFind')};

  //create array with sheets in active spreadsheet
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
  var sheetNumber = sheets.length;
  var currentSheet = ss.getIndex()-1;
  Logger.log(currentSheet);

  //loop through sheets to look for value
  for (var i = currentSheet ; i<sheetNumber ; ++i ){
    Logger.log('currentSheet = '+i)
    //Set active cell to A1 on each sheet to start looking from there
    SpreadsheetApp.setActiveSheet(sheets[i])
//    sheets[i].getRange(1,1).activate();
    //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 sheet  
    for(var r=activeR;r<data.length;++r){
      for(var c=activeC;c<data[0].length;++c){
        step++
          Logger.log('sheet : '+i+'    step:'+step+'   value '+value+'  =  '+data[r][c]);
        if(data[r][c]==''||(step==1&&i==currentSheet)){ continue };
        if(value.toString().toLowerCase()==data[r][c].toString().toLowerCase()){
          sheets[i].getRange(r+1,c+1).activate().setBackground('#ffff55');
          ScriptProperties.setProperty('valueToFind',value);
        return;
        }
      }
    }
      cell = sheets[i].getRange(1,1);

  }  
  ScriptProperties.setProperty('valueToFind','');
  Logger.log('reset');
}
函数SearchAndFind(){
//确定所选单元格的值
var sh=SpreadsheetApp.getActiveSpreadsheet();
var ss=sh.getActiveSheet();
var cell=ss.getActiveCell();
var value=cell.getValue();
if(ScriptProperties.getProperty('valueToFind')!=“”){value=ScriptProperties.getProperty('valueToFind')};
//使用活动电子表格中的图纸创建阵列
var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets()
var sheetNumber=sheets.length;
var currentSheet=ss.getIndex()-1;
Logger.log(当前表);
//在表格中循环查找值

对于(var i=currentSheet;i您是否考虑过这样一个事实,即您的代码只在大于活动行/列的行和列中查找搜索项。例如,如果B3中有“Test”一词,而另一个工作表的A1中有相同的“Test”一词,则找不到它,因此不会发生高亮显示和移动光标的情况,也不会删除eve设置活动内容的rything。它不必要而且速度慢得多。您不需要更改活动工作表或范围来读取或写入它。@ZigMandel您是对的,但这是我在更“复杂”方面缺乏的经验coding@Srik您是对的,但是我的代码在开始循环遍历每张工作表上的数据之前不是已经“修复”了这个问题吗?谢谢您的支持答案是肯定的。我下个星期会玩一玩!
function SearchAndFind() {

  //determine value of selected cell
  var sh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sh.getActiveSheet();
  var cell = ss.getActiveCell();
  var value = cell.getValue();
  if(ScriptProperties.getProperty('valueToFind')!=''){value = ScriptProperties.getProperty('valueToFind')};

  //create array with sheets in active spreadsheet
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
  var sheetNumber = sheets.length;
  var currentSheet = ss.getIndex()-1;
  Logger.log(currentSheet);

  //loop through sheets to look for value
  for (var i = currentSheet ; i<sheetNumber ; ++i ){
    Logger.log('currentSheet = '+i)
    //Set active cell to A1 on each sheet to start looking from there
    SpreadsheetApp.setActiveSheet(sheets[i])
//    sheets[i].getRange(1,1).activate();
    //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 sheet  
    for(var r=activeR;r<data.length;++r){
      for(var c=activeC;c<data[0].length;++c){
        step++
          Logger.log('sheet : '+i+'    step:'+step+'   value '+value+'  =  '+data[r][c]);
        if(data[r][c]==''||(step==1&&i==currentSheet)){ continue };
        if(value.toString().toLowerCase()==data[r][c].toString().toLowerCase()){
          sheets[i].getRange(r+1,c+1).activate().setBackground('#ffff55');
          ScriptProperties.setProperty('valueToFind',value);
        return;
        }
      }
    }
      cell = sheets[i].getRange(1,1);

  }  
  ScriptProperties.setProperty('valueToFind','');
  Logger.log('reset');
}