状況:
- 1 スプレッドシート
- 複数のシート
- 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;
}
}
}
}
}