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

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

ただいまの
回答率

90.33%

  • Google Apps Script

    959questions

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

抽出部分に文字列が存在しなかった場合の条件の書き方。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 188

koromo_t

score 50

正規表現で抽出した部分に文字列が「存在した場合」と
「存在しなかった場合」の条件付けをIF関数でやりたいです。

タイトル/著者名

というフォーマットの文字列がありまして、
以下のように、文字列の一部を抽出します。

  // タイトルの抽出
  var reg = "^(.*?)\/";
  var title_nama = title_hissya_nama.match(reg)[1];
  Logger.log(title_nama);

指定した部分に文字列が存在した場合は問題ないのですが、
今回、わからないのは、指定した部分に文字列が「存在しなかった場合」です。
例えば、/著者名の部分が無く、タイトルのみの場合です。
「実行に失敗: TypeError: null からプロパティ「1」を読み取れません。」
というエラーが出ます。そういうエラーが出ること自体は、わからなくもありません。

エラーに「null」と言われたので、IF関数の部分は、以下のように書いています。

  // 通常は抽出部分に文字列があるはずなので、「nullではない場合」。
  if(title_nama != null){
  title.setValue(title_nama);
  }
  // イレギュラーながら、抽出部分に文字列がない場合もあるので、「nullではない場合以外」。
  else{
  title.setValue(title_hissya_nama);
  }

「nullではない場合」の部分は期待通りに働くのですが、
「nullではない場合以外」のほうが期待通りの結果を得ることが出来ません。
おそらく、条件の書き方がよくないのだと思うのですが、
どうすれば期待通りの結果を得ることが出来るでしょうか。
教えていただけると嬉しいです。
よろしくお願いします。

 自己解決(2018/05/15 3:25)

ちょっと閃きまして。
まず、「文字列にスラッシュを含むかどうか」の判定でワンクッション置き、
「文字列にスラッシュを含むなら、正規表現で文字列を抽出」
「文字列にスラッシュを含まないなら、そのままの文字列を出力」
という条件付けをすればいいんじゃね?
と思って、その通りにスクリプトを書き直したところ、
期待通りの結果を得ることが出来ました!(下記参照)
ありがとうございました!

  if(title_hissya_nama.match(/\//)){
  var reg = "^(.*?)\/";
  var title_nama = title_hissya_nama.match(reg)[1];
  Logger.log(title_nama);
  title.setValue(title_nama);
  }
  else{
  title.setValue(title_hissya_nama);
  }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

+1

 自己解決(2018/05/15 3:25)

ちょっと閃きまして。
まず、「文字列にスラッシュを含むかどうか」の判定でワンクッション置き、
「文字列にスラッシュを含むなら、正規表現で文字列を抽出」
「文字列にスラッシュを含まないなら、そのままの文字列を出力」
という条件付けをすればいいんじゃね?
と思って、その通りにスクリプトを書き直したところ、
期待通りの結果を得ることが出来ました!(下記参照)
ありがとうございました!

  if(title_hissya_nama.match(/\//)){
  var reg = "^(.*?)\/";
  var title_nama = title_hissya_nama.match(reg)[1];
  Logger.log(title_nama);
  title.setValue(title_nama);
  }
  else{
  title.setValue(title_hissya_nama);
  }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/16 18:09 編集

    やりかたとして正しいと思います。これを自己解決するとしたらすごいセンスある気がしますが、回答を見に来た他の方へ蛇足的補足をさせてください。

    スラッシュの判定ですが、 わざわざわけなくても。
    if(title_hissya_nama.match(reg)) { var title_nama = title_hissya_nama.match(reg)[1] }
    とすることができるかと思います。
    /* エラーは、matchした結果はnullだったよ。nullは[1]をもってないよ。と言っており、単純に考えると、じゃあnullだったら(nullじゃなかったら)処理しよう、という流れがプログラムで良くあるパターンかと思います */

    また、「単にある文字があるかないか」というのは、"文字列".includes("探すもの")とすることができます。/* /\//は初見殺しかと。nama.includes("/")のほうが見易いかなと。*/

    キャンセル

  • 2018/05/16 20:12 編集

    !! お褒めにあずかり光栄です…!(笑)
    暗中模索のなかで得る閃きの瞬間というのは、とてもよいものです…(笑)。

    なるほど、やってること自体は同じでも(厳密には違う気がしますが)、
    こう書くと二度手間を回避できますね。

    var reg = "^(.*?)\/";
    if(title_hissya_nama.match(reg)){
    var title_nama = title_hissya_nama.match(reg)[1];
    Logger.log(title_nama);
    title.setValue(title_nama);
    }
    else{
    title.setValue(title_hissya_nama);
    }

    こんな感じでしょうか。動作確認済みです。
    今回の場合は判定後に文字列の抽出作業があるのでこれを採用することにしますが、
    文字列に特定の文字を含むかの判定だけで済む場合なら、
    includes()のほうが、餅は餅屋的な感じはしますね(?)。

    確かに、エスケープのためのバックスラッシュは、
    仕組みをわかってしまえばわかるのですが、
    初見では私も調べる必要があったと記憶しています…(笑)。

    それが、ちょうど、よいサンプルになりそうな部分があるんですよね~
    …と思って、ちょっと使ってみたのですが、なんかエラー(※)になりました…(笑)。
    ※:「実行に失敗: TypeError: オブジェクト ***で関数 includes が見つかりません。」

    使いどころがよくなかったのでしょうか?
    今回は、以下の部分に使ってみました。

    まずは元のスクリプト。

    // Googleカレンダー用成形
    var google = sheet.getRange(lastRow+1,11);
    if(title_hissya_nama.match(/\//)){
    google.setValue(title_nama + " / " + hissya_nama + "【読書メモ】");
    }
    else{
    google.setValue(title_hissya_nama + "【読書メモ】");
    }

    ↑これを…、

    // Googleカレンダー用成形
    var google = sheet.getRange(lastRow+1,11);
    if(title_hissya_nama.includes("/")){
    google.setValue(title_nama + " / " + hissya_nama + "【読書メモ】");
    }
    else{
    google.setValue(title_hissya_nama + "【読書メモ】");
    }

    このように。
    こうすれば、文字列にスラッシュが含まれていればtrue、含まれていなければfalseが返って、
    IF関数による分岐が可能かと思ったのですけどもね…。
    ちなみに、match()を使うと動作するので、
    原因と考えられるのはincludes()部分だと思うのですが、
    なにか使用条件的なものがあるんでしょうか…。

    キャンセル

  • 2018/05/17 00:16

    大変申し訳ないです、google app scriptの文字列には、includesが備わっていませんでした。辻褄があわないのと、反省のためにコメントは残しておきます。

    "餅は餅屋"というのはまさに意図していたことです。

    //余談ですが、includes()が備わる以前のjavascriptでは、
    if(name.indexOf("/") !== -1)
    という方法を使っていたりしました。
    意味は、name変数で、/は何番目(0はじまり)かを尋ねて、なければ-1になる(○番目の○に入り得ない負の数をエラーとして利用)ことを使った手法ですが、可読性が必ずしも高くないので採用するほどではないと思います。

    重ねてすみませんでした

    キャンセル

  • 2018/05/18 20:37

    なるほど! GASはほぼjavaScriptみたいなものだと認識していましたが、
    そういう場合もあるんですね! 勉強になりました!

    //なるほどー、「いまあるもので期待通りの結果を得るためには
    どうすればよいのか」を考えた結果、という感じがしますね!
    includes()と比べると、ずいぶん遠回りに感じます。
    javaScriptという言語も、新たなメソッド?が生まれたりして、
    わかりやすく進化していっているのですね。感慨深いです。
    ちなみに、今回活躍してくれたmatch()はいつから居るのでしょう。
    便利ですが、古株さんなのでしょうか。

    いえいえ、知識が増えることはよいことなので、お気になさらず!

    キャンセル

  • 2018/05/21 15:07

    gasは、とある時期のjavascriptです(javascriptはブラウザなど環境ごとにどこまでの仕様をサポートしているかが異なります)

    matchさんは1999年くらいからいるっぽいです。なかなかの古株ですね。

    キャンセル

  • 2018/05/23 07:56 編集

    matchさん(笑)。
    javaScriptのWikipediaからリンクされている、
    ECMAScriptとやらのバージョンのEdition3の欄に正規表現とあるので、
    これのことですかね。おそらく。
    97年のEdition1の欄に初版と書かれているので、それと比べると、
    おっしゃる通り、matchさんはだいぶ古株なんですね。
    なんか、一覧には「放棄」というのもあるけどなんだろうと思ったら、
    意見がまとまらなかったとかで、そういうこともあるんだ…と(笑)。
    javaScriptは人間が作っているものなのだなと実感するエピソードですね。
    回答ありがとうございます!

    でですね、今度お返事があったら書こうと思っていたことなのですが、
    以下、少々立ち入った話かもしれず、さらには質問の内容とは関係ない話なので、
    書き込みとしてふさわしくないかとも思ったのですが、とりあえず書きます。
    問題があるという指摘があれば消します。
    応答については、もしよければでかまいません。

    ---

    ものすごく余談ながら、最近、このサイトを利用するようなプログラミングをする人は、
    どのようにしてプログラミングと出会っているのだろうと思うことがあって、
    特にpapinianusさんはローマ法学者でいらっしゃる(という認識でよいのでしょうか?)ことと、
    なにか関係があるのかなとか思ったので、ちょっと書いてみました。

    キャンセル

  • 2018/05/23 16:49

    ECMAScriptは仕様書ですね。仕様をどこまで実装(実現、実際に動くものにするか)はブラウザだったり、google app scriptだったり、の作者(作成企業)次第です。

    答えられることは何でも答えますが、ここに書いていいのかは悩ましいですね。利用規約には反しているかもしれません(意に反しなければツイッタとかでメッセージをいただいたりしたほうがいいかもしれない)。

    私としては自分を(ローマ)法学者だと思っていますが、博士号も弁護士資格ももってないので、ホントの法学者が私を法学者だと認めてくれるかは微妙ですね。
    生業としては、IT系の仕事で仕様書を書いたりプログラムを書いたりデータを見たり色々やっています。
    ただ、(法学の)学生時代からプログラムを書いていたりしたので、仕事で出会ったというのは微妙ですね(もちろん仕事にする前と後では全然違いますが)
    個人的な見解というか思い込みですが、ここで回答をするような人は、出会いはともかく"ずっと続けている"、"続けていることが嫌ではない"という人達かなーと思ってます。

    キャンセル

  • 2018/05/24 17:23

    ですよね、ここは好奇心の抑えどころかもしれないとも思ったのですが、
    他の人だったら、スルーあるいは批判されるかもしれないなと予測がつくケースもあるけども、
    papinianusさんについてはそうはならないような気がして、
    ただ、利用規約のほうがなーと、私もそれを思いました…w

    それでpapinianusさんの個人ページに伺ったところ、
    Twitterアカウントが新たに?書かれていたので、さっそくフォローさせていただきましたw
    私のTwitterはほとんど記録用みたいになっていますが、とりあえず窓口確保、的な感じで…(笑)。

    あ、なんかデリケートなところに触れてしまったでしょうか、
    あんまり深い考えがあっての質問ではありませんでした、すみません…。

    ほー、学生時代から…。
    ちなみに私は、後述するアクシデントがあって初めてプログラミングをする機会を得たので、
    それまでHTMLやCSSぐらいまでしか縁がない人生だったこともあって、
    みなさんどうやって出会うんだろうなと思ったのが質問のきっかけでした。

    > "ずっと続けている"、"続けていることが嫌ではない"
    ですよね。プログラミングというのは結構、気質的に合う合わないがあるような気がします。
    私はどうかと考えると、どうやら嫌いではなさそうです。
    こう、問題を追究していく感じといいますか。いまのところ、楽しいと感じています。

    //
    実は、前回のお返事の時点で、
    一方的に質問するだけというのもどうよと思い、私の場合の話も書いていたのですけど、
    余談にスペースを割き過ぎるのもどうかと思い、質問するだけに留めたのですが、
    やっぱり、せっかく書いたので、以下、省略した部分も載せておきます。
    こ、今回は特例ということで…!(笑)

    ---

    ちなみに私の場合は、ブログをやっていて、
    WEB拍手というサービスを利用していたのですが、通知機能はなく、
    自分でサイトに出向きメッセージの有無をチェックせねばならなかったのですが、
    あまりにメッセージが来なさすぎて、いつしかメッセージのチェックをしないようになり、
    それならそれで拍手ページへのリンクボタンを奥に引っ込めておけばよいものを、
    WEB拍手の存在自体を失念してしまっていたところもあって、表に出しっぱなしにしていた結果、
    ふとWEB拍手の存在を思い出してチェックしたところ、
    2年前に送られたメッセージに最近気がつく、という不手際があって、これではいけないと、
    Googleフォームでメッセージがあればメールで通知する仕組みをGASで作ったことが、
    私のJavaScriptとの出会いでした。

    [参考(?)]
    【もくじページ(https://sites.google.com/view/koromokuji/)>2018年>2018年 ひとりごと(お知らせとか?)その1>WEB拍手にメッセージをいただいていたことに気付いたシリーズ。】以降

    --

    よくも悪くも、必要は発明の母であり、
    ヒューマンエラー?回避のためのシステムづくりの重要性を痛感しました…(笑)。
    (まぁ、あまりGASを頼みにしすぎても、なにかのきっかけでシステムが止まっていた、
    なんていうことが起こらないとも限らないので、たまには自分でメッセージチェックを
    したほうがよいのかもしれないとは思っていますが…)

    まあ、なにはともあれ、おかげでプログラミングとの縁ができたので、
    その点についてはプラスだととらえております(笑)。
    わからないことがわかるようになることは、とても楽しいものです。
    とはいえ、現在制作中のプロジェクトはとりあえず完成という形となり、
    そうなると、いよいよネタ切れです。
    わからないことがないという状況は結構なことなのですが、
    成長のタネもないわけで、少々さみしくもあります。なにか作りたいものです。

    思いの丈を書いているうちに、思いがけず長文になってしまいました。
    甘えてしまい、申し訳ありません。

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Google Apps Script

    959questions

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