質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Google Apps Script

    1257questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

GASで部分一致の文字列検索をしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,800

luckysuneo

score 5

 やりたいこと

GASで部分一致の文字列検索をしたい
EX:職種列に「事務」の文字を含む場合に「MATCH」の文字列を返したい

職種 判定
事務 MATCH
営業事務 MATCH
営業

 試したこと・問題

var OFFICE_WORK = ["事務","コールセンター","経理","会計","財務","総務","人事","法務","受付","秘書","広報","宣伝","IR","オペレーター","マーケティング","企画"]
function divisions(div) {
  if (OFFICE_WORK.indexOf(div) != -1) {
    return "MATCH";
  }
}


上記のコードでは、引数divがOFFICE_WORKの配列に対して完全一致になってしまう

部分一致はどの様にやれば良いのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ポイントは2つ

  • OFFICE_WORK.indexOf(div)と書いておられるのですが、Officeworkの一個ずつが渡されたとしても逆。キーワード群に対する部分一致では、div.indexOfで判定する必要がある
  • 配列で「一個でもあるか」のときはsome(判定関数)一択。反対の処理で全部が~のときはevery
function test_divisions() {
  Logger.log(divisions("営業事務"));  // "Match"
  Logger.log(divisions("カスタマー"));  // ""
  Logger.log(divisions("事務企画"));  // "MATCH"
}
function divisions(div) {
  const  OFFICE_WORK = ["事務","コールセンター","経理","会計","財務","総務","人事","法務","受付","秘書","広報","宣伝","IR","オペレーター","マーケティング","企画"]
  return OFFICE_WORK.some(function(element) {return div.indexOf(element) > -1 ;}) ? "MATCH" : "";
}

gasでは動くのでいいですが、部分一致してたら、matchと言うときは、一致しなかったときにも何か返してあげたほうがいいので、ここでは内容のない文字(空文字)を返す例をお示ししました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/24 09:52 編集

    蛇足なので、自分のスレッドに書きますが、.filterや.someを呼び出すとき、「.」の左が何であるかによって動作が決まります。配列のときだけ動きます。
    またシートに書く関数とスクリプトに書く関数は全く別です。(function filter()とやるとおかしくなるかもしれませんが…)

    キャンセル

  • 2018/10/24 16:50

    わかりやすい回答ありがとうございます。
    コードも無事に動作しました。

    キャンセル

0

filter を使うといいかもしれません。

function divisions(div) {
  // OFFICE_WORK の中で部分一致する要素のみを抽出する
  var matchedItems = OFFICE_WORK.filter(o => div.indexOf(o) > -1);
  // 抽出結果が0件でないなら、MATCHと判定する
  if (matchedItems.length > 0) {
    return "MATCH";
  }
}

参考:
Array.prototype.filter() - JavaScript | MDN

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/24 09:46

    ご回答ありがとうございます。
    いただいたコードを実行すると「構文エラー」が出てしまいます。
    エラーの原因は特定できていないのでこれは予想なのですが、スプレッドシートの関数にも「filter」がありJSのそれとは別の動きをします。
    なので、GASではfiletrメソッドは使えないのではないかと思います。
    別の手はありませんでしょうか?

    キャンセル

  • 2018/10/24 09:48

    gasでもfilterは使えます。

    キャンセル

  • 2018/10/24 09:49

    var matchedItems = OFFICE_WORK.filter(function(o) {div.indexOf(o) > -1;});
    と書けばエラーが解消されます。
    回答者さんは新しいJSの書き方を使っていますがGASは少し古いJS(rhino)なので、理解できなかった模様

    キャンセル

  • 2018/10/24 10:02

    ありがとうございます!
    無事に実行することができました!!

    キャンセル

  • 2018/10/25 10:18

    papinianusさん、補足ありがとうございます。GASではアロー関数式が使えないんですね、動作確認してから回答するべきでした。
    luckysuneoさん、混乱させてしまったようで失礼しました。

    キャンセル

同じタグがついた質問を見る

  • Google Apps Script

    1257questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。