TextFinderで正規表現を使いたくて書きました。
AND検索をしたかったので
正規表現でAND検索を試してみる2
でやった正規表現を使います。
各々設定する箇所
- SPREADSHEET_URL
- 文字列1
- 文字列2
を設定してfindAllRows()を実行すると
正規表現に一致する行が取得できます。
コード.gs
function findAllRows(){
var rows = [];
var ss_url = 'SPREADSHEET_URL';
var ss = SpreadsheetApp.openByUrl(ss_url);
var sheet = ss.getSheets()[0];
var textFinder = sheet.createTextFinder("^(?=.*文字列1)(?=.*文字列2)").useRegularExpression(true);
var ranges = textFinder.findAll();
for ( var i = 0; i < ranges.length; i++ ) {
rows.push(ranges[i].getRow()) ;
}
Logger.log(rows);
}
|
補足1
複数のセルをまたいで抽出するには別途ループ処理などの対応が必要です。
たとえば
"^(?=.*あめ)(?=.*がむ)"
とした時
A1セルに「あめ、がむ」←同じセル内なのでHITする
A2セルに「あめ」B2セルに「がむ」←セルが異なるのでHITしない
補足2
セルに改行が入っている場合はこれでいけた
"^(?=.*文字列1[\\s\\S])(?=.*文字列2[\\s\\S])"
こちらを参考にさせていただきました。
https://teratail.com/questions/197111
補足3
特殊文字を含む場合はエスケープが必要
たとえば以下のようなURLを完全一致で検索する場合
var value = "https://drive.google.com/file/d/ID/view?usp=drivesdk";
var pattern = "^" + value.replace(/\//g, "\\/").replace(/\?/g, "\\?").replace(/\=/g, "\\=") + "$";
var textFinder = sheet.createTextFinder(pattern).useRegularExpression(true);
手元ではこれでいけた。
参考
useRegularExpression(useRegEx)
https://developers.google.com/apps-script/reference/spreadsheet/text-finder.html#useRegularExpression(Boolean)
https://teratail.com/questions/197111