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