「特定の文字が入ったセルを探す」「シート全体の語句を一括置換する」——GASでこれを行うのが createTextFinder です。find 系で検索、replaceAllWith で一括置換できます。この記事ではコピペで動くコード例で、検索・置換をまとめて解説します。
この記事のポイント
- 検索は
createTextFinder("語")→findAll()(全件・Range配列)/findNext()(1件ずつ)- 一括置換は
replaceAllWith("置換語")(置換した件数が返る)- 大文字小文字の区別やセル全体一致、正規表現はオプションで切り替え
- シート全体・特定範囲・列だけ、と対象を絞れる
セルを検索する:createTextFinder + findAll
シートに対して createTextFinder を作り、findAll() で一致セルをRangeの配列として取得します。
function findCells() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const finder = sheet.createTextFinder("未対応");
const matches = finder.findAll(); // 一致したセル(Range)の配列
matches.forEach(function(range) {
Logger.log(range.getA1Notation() + " : " + range.getValue());
});
Logger.log("見つかった件数: " + matches.length);
}
1件ずつ順番に処理したいときは findNext() を使います(見つからなければ null)。
一括置換する:replaceAllWith
シート内の語句をまとめて置き換えます。戻り値は置換した件数です。
function replaceAll() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const finder = sheet.createTextFinder("旧社名");
const count = finder.replaceAllWith("新社名");
Logger.log(count + " 件を置換しました");
}
検索条件を細かく指定する
デフォルトは「大文字小文字を区別しない・部分一致」です。条件はメソッドチェーンで切り替えます。
function findOptions() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 大文字小文字を区別 + セル全体が一致するものだけ
const finder = sheet.createTextFinder("OK")
.matchCase(true) // 大文字小文字を区別
.matchEntireCell(true); // セルの中身がぴったり一致
Logger.log(finder.findAll().length);
}
正規表現で探したいときは useRegularExpression(true) を付け、検索語にパターンを渡します(例:数字を含むセル "[0-9]+")。
対象範囲を絞って検索する
シート全体ではなく「B列だけ」「特定範囲だけ」を検索することもできます。getRange に対して createTextFinder を作ります。
function findInColumn() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// B列だけを対象に検索
const matches = sheet.getRange("B:B").createTextFinder("完了").findAll();
Logger.log("B列で見つかった件数: " + matches.length);
}
実践:見つけたセルの隣に書き込む
検索結果はRangeなので、getRow() で行番号を取って隣のセルを操作できます。
function markDone() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const matches = sheet.createTextFinder("要確認").findAll();
matches.forEach(function(range) {
const row = range.getRow();
sheet.getRange(row, 5).setValue("チェック済"); // 同じ行のE列に書き込む
});
}
よくあるつまずきと直し方
大文字小文字が区別されない → デフォルトは区別しません。.matchCase(true) を付けます。
部分一致で余計なセルも引っかかる → .matchEntireCell(true) でセル全体一致に。
findNextが止まらない/nullになる → findNext() は見つからないと null を返します。全件まとめてなら findAll() が安全。
置換されない → replaceAllWith の戻り値(件数)を確認。0なら検索語が一致していません(全角/半角・空白に注意)。
この記事のポイント(まとめ)
| やりたいこと | 使うもの |
|---|---|
| 全件検索 | createTextFinder("語").findAll() |
| 1件ずつ | findNext()(無いとnull) |
| 一括置換 | replaceAllWith("語")(件数を返す) |
| 条件指定 | matchCase / matchEntireCell / useRegularExpression |
| 範囲を絞る | getRange("B:B").createTextFinder(...) |
次のステップ
あわせて読みたい
日付を検索対象にすると、セルの中身が文字列ではなく日付値のために意図した一致にならないことがある。日付が実際にどう保持されているかは次の記事にまとめている。
コメント