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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

Q&A

解決済

1回答

2804閲覧

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

koromo_t

総合スコア60

Google Apps Script

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

0グッド

0クリップ

投稿2018/05/14 07:27

編集2018/05/14 18:38

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

タイトル/著者名

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

javaScript

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

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

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

javaScript

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

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

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

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

javaScript

1 if(title_hissya_nama.match(///)){ 2 var reg = "^(.*?)/"; 3 var title_nama = title_hissya_nama.match(reg)[1]; 4 Logger.log(title_nama); 5 title.setValue(title_nama); 6 } 7 else{ 8 title.setValue(title_hissya_nama); 9 }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

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

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

javaScript

1 if(title_hissya_nama.match(///)){ 2 var reg = "^(.*?)/"; 3 var title_nama = title_hissya_nama.match(reg)[1]; 4 Logger.log(title_nama); 5 title.setValue(title_nama); 6 } 7 else{ 8 title.setValue(title_hissya_nama); 9 }

投稿2018/05/14 18:30

編集2018/05/14 18:39
koromo_t

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/05/16 09:10 編集

やりかたとして正しいと思います。これを自己解決するとしたらすごいセンスある気がしますが、回答を見に来た他の方へ蛇足的補足をさせてください。 スラッシュの判定ですが、 わざわざわけなくても。 if(title_hissya_nama.match(reg)) { var title_nama = title_hissya_nama.match(reg)[1] } とすることができるかと思います。 /* エラーは、matchした結果はnullだったよ。nullは[1]をもってないよ。と言っており、単純に考えると、じゃあnullだったら(nullじゃなかったら)処理しよう、という流れがプログラムで良くあるパターンかと思います */ また、「単にある文字があるかないか」というのは、"文字列".includes("探すもの")とすることができます。/* ///は初見殺しかと。nama.includes("/")のほうが見易いかなと。*/
koromo_t

2018/05/16 14:59 編集

!! お褒めにあずかり光栄です…!(笑) 暗中模索のなかで得る閃きの瞬間というのは、とてもよいものです…(笑)。 なるほど、やってること自体は同じでも(厳密には違う気がしますが)、 こう書くと二度手間を回避できますね。 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()部分だと思うのですが、 なにか使用条件的なものがあるんでしょうか…。
papinianus

2018/05/16 15:16

大変申し訳ないです、google app scriptの文字列には、includesが備わっていませんでした。辻褄があわないのと、反省のためにコメントは残しておきます。 "餅は餅屋"というのはまさに意図していたことです。 //余談ですが、includes()が備わる以前のjavascriptでは、 if(name.indexOf("/") !== -1) という方法を使っていたりしました。 意味は、name変数で、/は何番目(0はじまり)かを尋ねて、なければ-1になる(○番目の○に入り得ない負の数をエラーとして利用)ことを使った手法ですが、可読性が必ずしも高くないので採用するほどではないと思います。 重ねてすみませんでした
koromo_t

2018/05/18 11:37

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

2018/05/21 06:07

gasは、とある時期のjavascriptです(javascriptはブラウザなど環境ごとにどこまでの仕様をサポートしているかが異なります) matchさんは1999年くらいからいるっぽいです。なかなかの古株ですね。
koromo_t

2018/05/22 23:02 編集

matchさん(笑)。 javaScriptのWikipediaからリンクされている、 ECMAScriptとやらのバージョンのEdition3の欄に正規表現とあるので、 これのことですかね。おそらく。 97年のEdition1の欄に初版と書かれているので、それと比べると、 おっしゃる通り、matchさんはだいぶ古株なんですね。 なんか、一覧には「放棄」というのもあるけどなんだろうと思ったら、 意見がまとまらなかったとかで、そういうこともあるんだ…と(笑)。 javaScriptは人間が作っているものなのだなと実感するエピソードですね。 回答ありがとうございます! でですね、今度お返事があったら書こうと思っていたことなのですが、 以下、少々立ち入った話かもしれず、さらには質問の内容とは関係ない話なので、 書き込みとしてふさわしくないかとも思ったのですが、とりあえず書きます。 問題があるという指摘があれば消します。 応答については、もしよければでかまいません。 --- ものすごく余談ながら、最近、このサイトを利用するようなプログラミングをする人は、 どのようにしてプログラミングと出会っているのだろうと思うことがあって、 特にpapinianusさんはローマ法学者でいらっしゃる(という認識でよいのでしょうか?)ことと、 なにか関係があるのかなとか思ったので、ちょっと書いてみました。
papinianus

2018/05/23 07:49

ECMAScriptは仕様書ですね。仕様をどこまで実装(実現、実際に動くものにするか)はブラウザだったり、google app scriptだったり、の作者(作成企業)次第です。 答えられることは何でも答えますが、ここに書いていいのかは悩ましいですね。利用規約には反しているかもしれません(意に反しなければツイッタとかでメッセージをいただいたりしたほうがいいかもしれない)。 私としては自分を(ローマ)法学者だと思っていますが、博士号も弁護士資格ももってないので、ホントの法学者が私を法学者だと認めてくれるかは微妙ですね。 生業としては、IT系の仕事で仕様書を書いたりプログラムを書いたりデータを見たり色々やっています。 ただ、(法学の)学生時代からプログラムを書いていたりしたので、仕事で出会ったというのは微妙ですね(もちろん仕事にする前と後では全然違いますが) 個人的な見解というか思い込みですが、ここで回答をするような人は、出会いはともかく"ずっと続けている"、"続けていることが嫌ではない"という人達かなーと思ってます。
koromo_t

2018/05/24 08: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を頼みにしすぎても、なにかのきっかけでシステムが止まっていた、 なんていうことが起こらないとも限らないので、たまには自分でメッセージチェックを したほうがよいのかもしれないとは思っていますが…) まあ、なにはともあれ、おかげでプログラミングとの縁ができたので、 その点についてはプラスだととらえております(笑)。 わからないことがわかるようになることは、とても楽しいものです。 とはいえ、現在制作中のプロジェクトはとりあえず完成という形となり、 そうなると、いよいよネタ切れです。 わからないことがないという状況は結構なことなのですが、 成長のタネもないわけで、少々さみしくもあります。なにか作りたいものです。 思いの丈を書いているうちに、思いがけず長文になってしまいました。 甘えてしまい、申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問