PR

[GASの小技]GASで文字を検索!createTextFinder()の基本とfindNext()・findAll()の使い分け【初心者向け】

[GASの小技]GASで文字を検索!createTextFinder()の基本とfindNext()・findAll()の使い分け【初心者向け】 GAS

こんにちは!イカPOです。

スプレッドシート内で、特定の文字列が入力されているセルを探すときは、createTextFinder()findNext() を使うと簡単に検索できます。
今回は createTextFinder() と findNext() の使い方について解説します。


createTextFinder()と.findNext()

createTextFinder() は、指定された文字列を検索するための機能です。
たとえば、dataRange.createTextFinder(“シャンプー”) と書くと、dataRange という範囲の中から「シャンプー」という文字列を探してくれます。

そこから .findNext() を呼び出すと、見つかったセルの位置情報(Range オブジェクト)が返ってきます。
この Range オブジェクトを使えば、どのセルに文字が入っているかを簡単に特定できます。


rangeオブジェクトとは?

rangeオブジェクトとは、スプレッドシート内の特定のセルや範囲の「位置情報」を持ったオブジェクトです。
これを使うことで、セルの場所を特定し、関連する情報を取得できます。

たとえば、「A1セル」というセルの位置情報を持つ rangeオブジェクトなら、そのセルが**どこにあるか(位置)**だけでなく、どんな値が入っているか、どのシートに属しているかなどの情報も取得できます。

rangeオブジェクトで取得できる情報

このセルがどこにあるかを表すのがrangeオブジェクト
  • getA1Notation(): A1形式(「B2」「C10」など)でセルの位置を取得
  • getRow(): セルの行番号(1,2,3…)を取得
  • getColumn(): セルの列番号(1,2,3…)を取得
  • getValue(): セルに入っている**値(文字列や数値など)**を取得
  • getSheet().getName(): そのセルがあるシート名を取得

このように、rangeオブジェクトがあれば、
セルがどこにあるのか(位置情報)
セルの中にどんなデータが入っているのか
どのシートにあるのか
を簡単に取得できます。

rangeオブジェクトとは、スプレッドシートの「セルの住所」を持ったデータと考えるとわかりやすいです。


サンプルコード(シャンプーの位置を特定してみよう)

今回の例では、用品一覧シートから「シャンプー」という文字列が入っているセルを探して、そのセルの位置を表示させてみます。

サンプルデータ

シート名:「用品一覧」

用品ID用品名カテゴリー
1001シャンプー風呂
1002リンス風呂
1003ボディソープ風呂
1004トイレットペーパートイレ
1005トイレ用洗剤トイレ
1006トイレ掃除シートトイレ
1018ベビーローション子供
1019おしり吹き子供
1020ワセリン子供
1021おむつ用ごみ袋子供
1022ゴミ袋掃除
1023シャンプー風呂

上記のようにシャンプーが2つ入っているので、実行結果に注目してみましょう。

function searchRowWithTextFinder(){

  const sheet = SpreadsheetApp.getActiveSpreadsheet();

  const targetsheet = sheet.getSheetByName("用品一覧");

  const dataRange = targetsheet.getDataRange();

  // 「シャンプー」という文字を探すFinderを作成

  const finder = dataRange.createTextFinder("シャンプー");

  // 1つ目にヒットしたセル(Rangeオブジェクト)を取得

  const foundRange = finder.findNext();

  if(foundRange){

    // シャンプーが見つかったときに情報をログに出す

    Logger.log(`見つかったセルの位置は${foundRange}`);

    Logger.log(`見つかったセルの位置は${foundRange.getA1Notation()}`);

    Logger.log(`見つかったセルの行番号は${foundRange.getRow()}`);

    Logger.log(`見つかったセルの中身は${foundRange.getValue()}`);

    Logger.log(`見つかったセルが属するシート: ${foundRange.getSheet().getName()}`);

  }

  else{

    // 該当の文字が見つからなかった場合

    Logger.log("指定の位置は見つかりませんでした。");

  }

}

お決まりのスプレッドシートからデータを取得

const sheet = SpreadsheetApp.getActiveSpreadsheet();

const targetsheet = sheet.getSheetByName("用品一覧");

const dataRange = targetsheet.getDataRange();
  • SpreadsheetApp.getActiveSpreadsheet(): 現在アクティブなスプレッドシートを取得
  • sheet.getSheetByName(“用品一覧”): その中の「用品一覧」という名前のシートを取得
  • .getDataRange(): そのシート内にあるデータ範囲すべてを取得

このあとの検索処理は dataRange に対して行います。


文字列の検索と一致したセルの位置情報を確認してみよう[findNext()]

const finder = dataRange.createTextFinder("シャンプー");

const foundRange = finder.findNext();
  • createTextFinder(“シャンプー”): 「シャンプー」という文字列を検索条件に指定
  • findNext(): 最初にヒットしたセルを返してくれる(Range オブジェクト)

ここで返ってくる foundRange は、「シャンプー」が入っているセルの rangeオブジェクトです。


位置情報を確認しよう

if(foundRange){

  // 見つかった時の処理

} else {

  // 見つからなかった時の処理

}
  • foundRange が存在すれば、検索文字列が見つかったということになるので、そのときの処理を実行
  • 見つからなければ else 側の「見つかりませんでした」とログを出すだけ

Logger.log(`見つかったセルの位置は${foundRange}`);

この行では、Range オブジェクトがそのまま表示されます。多くの場合、ログには Range とだけ出るので、どのセルかはわかりにくいです。


翻訳してみよう(A1表記を確認する)

Logger.log(`見つかったセルの位置は${foundRange.getA1Notation()}`);
  • getA1Notation() は、B2 や C3 などの見慣れたセル番地(A1形式)を返してくれます。
  • 「B2」のように表示されれば、どのセルでヒットしたかわかりやすいです。

発見した文字列の位置情報を使って色々な情報を取得してみよう

Logger.log(`見つかったセルの行番号は${foundRange.getRow()}`);

Logger.log(`見つかったセルの中身は${foundRange.getValue()}`);

Logger.log(`見つかったセルが属するシート: ${foundRange.getSheet().getName()}`);
  • getRow(): 見つかったセルの行番号を返す
  • getValue(): そのセルに入っている値(文字や数値)を返す
  • getSheet().getName(): セルが属するシート名を返す

これらの情報を組み合わせると、検索でヒットしたセルの場所や値を自由に活用できます。


文字列が複数ある場合はどうするの?[.findAll()]

もし、同じ文字列が複数のセルに含まれる場合は、.findAll() を使うと便利です。
.findAll() は、該当する文字列を含むセルの Range オブジェクトを配列として返してくれます。

const finder = dataRange.createTextFinder("シャンプー");

const foundRanges = finder.findAll();

if(foundRanges){

  for(let foundRange of foundRanges){

    Logger.log(`見つかったセルの位置は${foundRange.getA1Notation()}`);

    Logger.log(`見つかったセルの行番号は${foundRange.getRow()}`);

    Logger.log(`見つかったセルの列番号は${foundRange.getColumn()}`);

    Logger.log(`見つかったセルの中身は${foundRange.getValue()}`);

    Logger.log(`見つかったセルが属するシート: ${foundRange.getSheet().getName()}`);

  }

} else {

  Logger.log("指定の位置は見つかりませんでした。");

}
  • foundRanges は配列なので、for 文を使って一つずつ処理すればOK
  • .findNext() だと最初にヒットしたセル1つしか取得しませんが、.findAll() ならすべてのセルを取得できます

まとめ

  1. createTextFinder() で検索文字列を指定し、.findNext() で「最初に見つかったセル(Range オブジェクト)」を取得できる。
  2. もし検索した文字列が複数のセルにある場合は、.findAll() を使うことですべての該当セルを取得できる。
  3. rangeオブジェクト はセルの「場所・値・シート名」など、さまざまな情報を持っている。getA1Notation() や getRow()、getValue() などを使って、必要な情報を取り出せる。

今回のサンプルでは「シャンプー」を探しましたが、実際にはさまざまな文字列を検索して活用できます。重複しない「ID」や「コード番号」のような唯一の値を検索するときは .findNext() 、複数ヒットする可能性がある場合は .findAll() を使ってみてください。

この記事についてのご意見や間違いのご指摘は、ぜひX(旧Twitter)でお知らせください!

皆さまのフィードバックをお待ちしています。以下のアカウントまでお気軽にメッセージをお寄せください。

この記事には筆者の個人的な解釈も一部含まれています。一つの参考としてお読みいただきつつ、最終的にはご自身や担当の方としっかり相談の上で判断いただけますと幸いです。

皆様の声で情報をアップデートしていきます。よろしくお願いします。

タイトルとURLをコピーしました