1

状況:

  1. 1 スプレッドシート
  2. 複数のシート
  3. 1 個のセルが選択されています (異なる場合があります)

私がしたいのは、スプレッドシートのボタンのような画像をクリックすると、選択したセル (大文字と小文字を区別しない) に一致するシートの次のセルを見つけてフォーカスを設定することです。MS Word が作成できるカスタム インデックスのようなものです。

私のアプローチは次のとおりです。-選択したセルの値を変数として設定する(成功)-その変数に一致する最初のセルを見つける(選択したセルではない)(成功なし)-見つかったセルの値を変数2として設定する(成功なし)-設定variable2 へのスプレッドシートのフォーカス (成功なし)

function FindSetFocus() 

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

//here comes the code :)

}

次のトピックでこのスニペットを見つけましたが、入力の設定と出力の操作に少し問題があります: Google スプレッドシートを検索するにはどうすればよいですか?

「value」を「valueactivecell」に置き換えることはできると思いますが、スプレッドシート内のすべてのシートを検索する範囲を設定する方法がわかりません。また、「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 に答える