はじめに
GAS(Google Apps Script)でWebアプリや検索機能を作っていると、ユーザーが「A」と入力しても「A」と入力しても同じ結果を返したい、という場面がありますよね。
日本語環境では全角英数字と半角英数字が混在しがちです。さらに大文字・小文字の違いまで加わると、単純な文字列比較ではヒットしないケースが続出します。
そこで、検索前に文字列を正規化(normalize)する関数を用意しておくと、表記揺れを気にせず検索できるようになります。
こんな場面で使えます
- スプレッドシートのデータを検索・フィルタリングするWebアプリ
- ユーザー入力のキーワードとデータベースの値を突合する処理
- 「ABC」「abc」「ABC」をすべて同じものとして扱いたいとき
- 日本語入力環境で全角英数が混ざりやすいフォーム検索
実装コード
正規化関数
以下の関数を追加するだけで、全角英数→半角英数の変換と大文字→小文字の統一ができます。
/**
* 文字列を正規化(大文字→小文字、全角英数→半角英数)
*/
function normalize_(str) {
return String(str)
.toLowerCase()
.replace(/[A-Za-z0-9]/g, function(s) {
return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
});
}
仕組みを簡単に説明します。
toLowerCase()で英字の大文字を小文字に統一- 正規表現
/[A-Za-z0-9]/gで全角英数字にマッチ - Unicodeコードポイントから
0xFEE0を引くことで半角に変換
0xFEE0 という数値は、全角英数と半角英数のUnicodeコードポイントの差分です。たとえば「A」(U+FF21) から 0xFEE0 を引くと「A」(U+0041) になります。
検索での使い方
検索する側・される側の両方を normalize_ に通してから比較します。
// ユーザー入力とデータの両方を正規化してから比較
var normalizedQuery = normalize_(userInput);
var normalizedTarget = normalize_(dataValue);
if (normalizedTarget.indexOf(normalizedQuery) !== -1) {
// ヒット!
}
使い方・カスタマイズ
スプレッドシートデータの検索に組み込む例
function searchData(keyword) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('データ');
var data = sheet.getDataRange().getValues();
var normalizedKeyword = normalize_(keyword);
var results = [];
for (var i = 1; i < data.length; i++) {
var name = normalize_(data[i][0]); // A列の名前を正規化
if (name.indexOf(normalizedKeyword) !== -1) {
results.push(data[i]);
}
}
return results;
}
カタカナの全角/半角も統一したい場合
現在の関数は英数字のみ対応しています。カタカナ(「カ」と「カ」など)も統一したい場合は、変換テーブルを追加する必要があります。
注意点・ハマりポイント
- GASでは
String.prototype.normalize('NFKC')が使えない場合があります。モダンブラウザなら使える便利なメソッドですが、GASのサーバーサイドでは動作が不安定なため、今回のように手動変換するのが確実です - この関数はあくまで「検索用の比較」に使うものです。表示用のデータまで変換してしまわないよう注意してください
- カタカナの全角/半角変換は文字の対応関係が複雑なため、必要になったら別途実装しましょう
まとめ
normalize_関数を通すだけで、全角半角・大文字小文字の違いを吸収できる- 検索する側・される側の両方を正規化してから比較するのがポイント
- GASでは
normalize('NFKC')が不安定なため、手動変換が確実
