Google スプレッドシートには、検索と置換機能(Ctrl + F)が備わっています。
今年4月のApps Scriptのアップデートによって、TextFinderクラスが実装され、Apps Scriptからも簡単に検索と置換を行うことができるようになりました。
すべてのシートを対象に検索
「検索と置換」ダイアログの「検索」から検索対象を指定できるように、スクリプトからも検索対象を指定できます。
まずは、すべてのシートを対象に検索を行うコードです。
Spreadsheet.createTextFinderメソッドでTextFinderオブジェクトを取得し、findAllメソッドで検索を行うコードです。
function sample1() {
Logger.log("--- sample1 ---");
var targetSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var finder = targetSpreadsheet.createTextFinder("河").useRegularExpression(true); //[正規表現を使用した検索]有効
var results = finder.findAll();
results.forEach(function(rng) {
Logger.log(rng.getSheet().getName() + ", " + rng.getA1Notation() + ", " + rng.getValue());
});
}
createTextFinderメソッドの引数で指定しているのは検索文字列で、useRegularExpressionメソッドの引数をtrueにすることで、「正規表現を使用した検索」オプションを有効にしています(今回の例では正規表現を使用していませんが・・・)。
結果は下図の通りで、すべてのシート上で検索が行われているのが確認できます。
なお、今回のスクリプトをテストするにあたって、データは「なんちゃって個人情報」で生成したものを利用しています。
指定したシートを対象に検索
次は、シートを指定して検索を行うコードです。
Sheet.createTextFinderメソッドを使用しています。
function sample2() {
Logger.log("--- sample2 ---");
var targetSheet = SpreadsheetApp.getActiveSheet();
var finder = targetSheet.createTextFinder("河").useRegularExpression(true); //[正規表現を使用した検索]有効
var results = finder.findAll();
results.forEach(function(rng) {
Logger.log(rng.getSheet().getName() + ", " + rng.getA1Notation() + ", " + rng.getValue());
});
}
指定したセル範囲を対象に検索
次は、指定したセル範囲を対象に検索を行うコードです。
Range.createTextFinderメソッドを使用しています。
function sample3() {
Logger.log("--- sample3 ---");
var targetRange = SpreadsheetApp.getActiveSheet().getRange("A2:A20");
targetRange.activate();
var finder = targetRange.createTextFinder("河").useRegularExpression(true); //[正規表現を使用した検索]有効
var results = finder.findAll();
results.forEach(function(rng) {
Logger.log(rng.getSheet().getName() + ", " + rng.getA1Notation() + ", " + rng.getValue());
});
}
ヒットしたセルを順次処理
次は、findNextメソッドを使って、ヒットしたセルに対して順次処理を行うコードです。
function sample4() {
var ui = SpreadsheetApp.getUi();
var targetRange = SpreadsheetApp.getActiveSheet().getRange("A2:A20");
var finder = targetRange.createTextFinder("河").useRegularExpression(true); //[正規表現を使用した検索]有効
var res = finder.findNext();
while(res !== null) {
res.activate();
if(ui.alert("セル[ " + res.getA1Notation() + " ]選択中\n処理を中止しますか?", ui.ButtonSet.YES_NO) == ui.Button.YES) {
break;
}
res = finder.findNext();
}
}
オプションを指定して検索
次は、「大文字と小文字の区別」「完全に一致するセルを検索」といったオプションを指定して検索を行うコードです。
検索オプションの指定には、ignoreDiacriticsメソッド(発音区別符号を無視するかどうか)、matchCaseメソッド(大文字と小文字の区別)、matchEntireCellメソッド(完全に一致するセルを検索)、matchFormulaTextメソッド(数式内も検索)、useRegularExpressionメソッド(正規表現を使用した検索)を使用します。
//オプションを指定して検索
function sample5() {
Logger.log("--- sample5 ---");
var targetSheet = SpreadsheetApp.getActiveSheet();
var finder = targetSheet.createTextFinder("IKEUCHI_hiroshi@example.com")
.ignoreDiacritics(true) //発音区別符号を無視する
.matchCase(true) //[大文字と小文字の区別]有効
.matchEntireCell(true) //[完全に一致するセルを検索]有効
.matchFormulaText(true); //[数式内も検索]有効
var results = finder.findAll();
results.forEach(function(rng) {
Logger.log(rng.getSheet().getName() + ", " + rng.getA1Notation() + ", " + rng.getValue());
});
}
ヒットした文字列を一括置換
次は、replaceAllWithメソッドを使って、ヒットした文字列を一括で置換するコードです。
function sample6() {
var targetSheet = SpreadsheetApp.getActiveSheet();
var finder = targetSheet.createTextFinder("@example.com");
var cnt = finder.replaceAllWith("@exampleXYZ.com");
SpreadsheetApp.getUi().alert(cnt + "件置換しました。");
}
確認しながら順次置換
最後は、findNextメソッドとreplaceWithメソッドを使って、順次確認しながら置換を行うコードです。
function sample7() {
var ui = SpreadsheetApp.getUi();
var targetSheet = SpreadsheetApp.getActiveSheet();
var finder = targetSheet.createTextFinder("@example.com");
var res = finder.findNext();
while(res !== null) {
switch(ui.alert("セル[ " + res.getA1Notation() + " ]の値[ " + res.getValue() + " ]を置換しますか?", ui.ButtonSet.YES_NO_CANCEL)) {
case ui.Button.YES:
finder.replaceWith("@exampleXYZ.com");
break;
case ui.Button.CANCEL:
case ui.Button.CLOSE:
return;
default:
break;
}
res = finder.findNext();
}
}
以上のように、TextFinderを使うことで、簡単に文字列の検索や置換が行えます。
使い勝手も良く、使用する機会も多い処理ですので、覚えておくと良いでしょう。























この記事へのコメントはありません。