質問: お世話になります。 Google apps scriptを勉強を始めたばかりのものです。(Javascriptは触ったことがありません) **<質問>** **GASにて配列内を正規表現で検索してTrueの場合に該当インデックス番号を返してくれる関数などはありませんでしょうか?** (indexOfの引数に正規表現を渡すようなイメージです。) 自分が考えたのは、配列.lengthの数でループしながら、Serachかmatchで検索してヒットしたらイテレータの番号を控える、というものですが、もっと簡単にできる関数はないのかなと探しておりますが見つけることができませんでした。 良い案をご存知の方がいらっしゃいましたらご教示のほど、宜しくお願いいたします。 **補足追記** インデックスがなぜ必要かという点に関しまして、説明不足で申し訳ありません。以下に補足させて頂きます。 検索したい当該の配列というのはメールで複数の取引先から送られてくる商品データのスプレッドシートを解析する為に各シートのdatarangeが入ります。配列内の商品コード列を検索して該当する商品名を取得したいとします。(要はEXCELのvlookupです。)シートは取引先によりフォーマットを改造している方がいるので、商品コード列が何列目にあるのかシートによりバラバラです。さらに最悪なことに列見出し項目名も「商品コード」だったり「品目コード」、「コード」だったりします。取引先によって処理を分けることも考えましたが、同じ取引先でも今後フォーマットが変わる可能性があります。 vlookupするにあたり、どの列が商品コード列なのか、を、曖昧検索で判定したく思いまして今回の質問に至った次第です。 (フォーマットを統一しろ!という話ですが、他社が絡む話なので強制しにくかったりいろいろありまして時間がかかりそうでして。。。(涙))
回答: 他の方法もあると参考になるかもしれないと思いましたので、いくつかある方法の一つとして、`test()`と`reduce()`を使用する方法について記載させていただきます。この方法でも配列をループして結果を取得する流れです。 ### サンプルスクリプト ``` var ar = ["foo", "bar", "baz"]; // サンプル配列 var regex = /b/; // ここに正規表現を設定 var res = ar.reduce(function(ar, e, i) { if (regex.test(e)) ar.push(i); return ar; }, []); Logger.log(res) // [1, 2] ``` * `test()`は、与えた文字列が正規表現にマッチするとtrue、マッチしないとfalseを返します。 * `reduce()`では、`test()`がtrueを返す場合に配列のインデックスを取得しています。 最終的にマッチしたインデックス`[1, 2]`が配列として返されます。 ### 参考 * test() * reduce()