MENU

GASのTextFinderで完全一致の行を探す

当ページのリンクには広告(PR)が含まれていることがあります。
GASのTextFinderで完全一致の行を探す。探す顧客ID、完全一致で検索、一致件数を確認の処理例。

顧客IDA-10を探したときにA-100も見つかると、取得できた行をそのまま使うのは危険です。GASのTextFinderは既定では部分一致なので、IDを探す用途ではセル全体の一致を指定します。さらに、結果が1件に決まったことも確認します。

ここで作るのは、練習用シートのID列を検索して、該当する行番号を返す関数です。検索と更新を分けているため、見つかったセルを書き換える処理はありません。1件だけの結果を受け取ってから、別の処理で内容を照合できる形です。

目次

ID列だけを検索する

シート「検索練習」のA1に「顧客ID」、A2以降にA-10、A-100、a-10を入れます。検索範囲をシート全体にすると、メモ欄のIDまで候補になるので、A列のデータ部分に限定します。

顧客IDで大文字と小文字を区別するならmatchCase(true)も必要です。区別しない業務なら別のルールになりますが、曖昧なまま小文字にそろえて同じ顧客と扱うのは避けます。前後の空白もこの例では不備として見つけられるようそのまま比較します。

検索条件は公式のTextFinderで確認できます。文字列を正規表現として解釈しない指定も入れ、IDに記号が含まれる場合に検索の意味が変わらないようにします。

結果が1件のときだけ行番号を返す

検索結果の先頭を無条件に選ばず、findAllで件数を確認します。0件と複数件では、どちらも後続の更新を止めるエラーにしています。

function findUniqueIdRow(sheet, id) {
  if (typeof id !== 'string' || id === '' || id.trim() !== id) {
    throw new Error('空白のないIDを指定してください');
  }
  const last = sheet.getLastRow();
  if (last < 2) throw new Error('検索対象がありません');
  const matches = sheet.getRange(2, 1, last - 1, 1)
    .createTextFinder(id)
    .matchEntireCell(true)
    .matchCase(true)
    .useRegularExpression(false)
    .matchFormulaText(false)
    .findAll();
  if (matches.length !== 1) {
    throw new Error('IDの一致件数を確認してください: ' + matches.length);
  }
  return matches[0].getRow();
}

function previewIdSearch() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('検索練習');
  if (!sheet) throw new Error('検索練習シートがありません');
  console.log(findUniqueIdRow(sheet, 'A-10'));
}

この入力なら、A-10だけが一致して、ログには2が出る想定です。A-100とa-10を除外できているかを、シートの表示とも見比べてください。範囲の行番号は1から始まります。配列の添字と混ぜやすい点は範囲と配列の基本で整理しています。

重複と数式の扱い

A5にもA-10を追加すると、同じIDが2件あるためエラーになります。どちらが新しいか、どちらが正式かをコードで推測しません。元の台帳を確認して重複を解消するか、IDに別の項目を組み合わせる設計へ変えます。

matchFormulaText(false)は、数式の文字そのものを探さず、数式セルの表示結果を対象にする指定です。ID列へ数式を入れる運用なら、値がどのように表示されるかも確認してください。先頭のゼロを持つIDは文字として管理し、数値表示の変更で別のIDに見えないようにします。

大量の行を何度も検索する用途では、一度読み取った配列から対応表を作る方法も候補です。ただし、速さだけを理由に一致のルールを変えないことが大切です。範囲の絞り込みと、一致件数の確認はどちらの方式にも残ります。

更新へ進む前に確かめること

行番号を取得した後に、別の人が並べ替える可能性があります。更新を組み込む場合は、更新直前にもその行のIDを確認し、行番号だけを長時間保存しないようにします。この検索関数だけで、同時編集の競合まで防げるわけではありません。

ローカルではTextFinderの代用を使い、条件の指定、1件・0件・重複、空のシートを確認しました。Googleの検索処理そのものは未実行です。実行に失敗した場合の確認先はGASの実行履歴とログも参考になります。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次