0

以下のコードを使用すると、スプレッドシート内の複数のシートを調べて、選択したセルと等しい最初の値を見つけることができます。このビットの唯一の問題は、値が見つかったセルが黄色で強調表示されますが、値が見つかったセルが選択されていないことです。シート間を移動するには、以下のコードを参照してください。私はこれについて頭を悩ませることができません:)

面白いことに、値を強調表示して選択するためのコードは、シートのリストを飛び回っていないときに機能します。最良の回答を参照してください: Google スクリプトを使用してスプレッドシートで値を検索する

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

0

このコードは複数のシートを検索できます。明らかに公開されたコードに基づいていますが、メモリ (scriptProperties) を使用して、あるシートから次のシートに変更するときに検索値を「有効」に保ち、いつ検索するかを認識します。 . これには 2 つの非最適な側面があります。1 つは、新しい検索を開始する前に、最後の出現箇所まで検索し続ける必要があることです。2° : シート n からシート n+1 に切り替えると、最初にセル A1 が選択されてから値の出現が検出されます。

これらの問題を取り除くことは可能だと思いますが、今のところ方法がわかりません:-) たぶん、アプローチは単に最善ではないかもしれません.単純な1枚のシートスクリプトを変更して複雑にすることから始めました...それは通常そうではありません.最高の開発戦略 (私は知っています) ですが、とにかく、それは面白い実験であり、良い論理演習でした ... ありがとうございました。

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');
}
于 2013-11-07T11:57:10.280 に答える