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

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

新規登録して質問してみよう
ただいま回答率
85.50%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

438閲覧

同様の条件が並ぶif文の簡潔な記述方法

cocomoco

総合スコア11

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/07/04 02:07

編集2020/12/15 12:33

前提・実現したいこと

全くの初心者で、最近プログラミングの学習をしております。
いま練習用に、GASにてあ行をか行、さ行へ変換するLine Botを作っています。
いろんなサイトを調べ、ここまでは作ることができたのですが、
IF文の繰り返しをあ、い、う、え、おと分けずに、IF文以外の方法で簡潔に処理する方法を知りたい。

Lineにて
あ、と送れば
か、さ
と返信されます。

あ、から、お、まで少ないので手間ではないですが、
今後何個もあるデータの中から値を取り出したいときに
IF文を何行も書いていては成長しないと思い質問させていただきました。

発生している問題・エラーメッセージ

if ('こんにちは' == user_message) {
reply_messages = ['こんにちは!か行,さ行に変換できます'];
} else if ("あ" == user_message) {
reply_messages = [reply + "\n" + reply2];
} else if ("い" == user_message) {
reply_messages = [reply + "\n" + reply2];
} else if ("う" == user_message) {
reply_messages = [reply + "\n" + reply2];
} else if ("え" == user_message) {
reply_messages = [reply + "\n" + reply2];
} else if ("お" == user_message) {
reply_messages = [reply + "\n" + reply2];
} else {
//母音が入力されたときの処理
reply_messages = ['母音以外は変換できません!'];

こちらのIF分を、同じ処理ができ、あ、い、う、え、お
と分けずに書く方法がいろいろ調べましたが解りませんでした。

該当のソースコード

function doPost(e) { var json = JSON.parse(e.postData.contents); var reply_token= json.events[0].replyToken; if (typeof reply_token === 'undefined') { return; } var user_message = json.events[0].message.text; var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getActiveSheet(); var range = sheet.getRange("A1:C7"); var value = range.getValues();  var i = value.length; var s = 0 ; for (s==0;s<i;s++){ if(value[s][0] == user_message){ var reply = value[s][1]; var reply2 = value[s][2]; } } var reply_messages; if ('こんにちは' == user_message) { //こんにちはと入力された際 reply_messages = ['こんにちは!か行,さ行に変換できます']; } else if ("あ" == user_message) { reply_messages = [reply + "\n" + reply2]; } else if ("い" == user_message) { reply_messages = [reply + "\n" + reply2]; } else if ("う" == user_message) { reply_messages = [reply + "\n" + reply2]; } else if ("え" == user_message) { reply_messages = [reply + "\n" + reply2]; } else if ("お" == user_message) { reply_messages = [reply + "\n" + reply2]; } else { reply_messages = ['か行、さ行以外には変換できません!']; } var messages = reply_messages.map(function (v) { return {'type': 'text', 'text': v}; }); UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': messages, }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); }

試したこと

for文を使えばできそうなのですが、2日ほど調べ色々と試しましたが、うまく動作しませんでした。

補足情報(FW/ツールのバージョンなど)

スプレッドシートに
l A l B l C l D l
1 母音 A K S
2 a あ か さ
3 i い き し
4 u う く す
5 e え け せ
6 o お こ そ
このデータがあります。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/07/04 02:27

「if文をまとめる」の意味がよく分かりませんが、具体的にどういうことでしょうか?
m.ts10806

2019/07/04 04:03 編集

タイトル調整願います。 >初心者です。 「初心者アイコン」を使ってください。 >IF文の処理についてわからないので教えて下さい! 何が分からないのか分かりません。要件を具体的に記載してください。 https://teratail.com/help/question-tips#questionTips3-1
cocomoco

2019/07/04 03:58

このようなタイトルでよろしいでしょうか? 初心者ですので、なんと言う言葉がぴったりなのかわかりませんが、 if文で同じような処理を繰り返して書いているので、その同じような処理を もっと簡潔に書く方法はないかと、for文を使ったりしましたが、解決できなかったので、 質問しました。
m.ts10806

2019/07/04 04:05

それだとしっかり文章です。 既にはりましたが下記参考にしてください。 https://teratail.com/help/question-tips#questionTips3-1 「同様の条件が並ぶif文の簡潔な記述方法」とかで良いのではないでしょうか。 ※ただし、言語は違えどこの手の質問はよく出ます。過去質問も参考にしてください。私も同様の質問に回答したことがあります。
cocomoco

2019/07/04 04:15

ありがとうございます。お教え頂いたタイトルに変更させていただきました。一応過去質問も色々参考にしたのですが、初心者故応用力、理解力が乏しく、解決できなかったので、質問させていただきました。また質問をする時には、もっと基本的なことを学習し、今回教えていただいたことを、私の空っぽの脳みそに叩き込みたいと思います。またその際は、色々と教えていただきたく思います。
m.ts10806

2019/07/04 04:20

>一応過去質問も色々参考にしたのですが であれば「この質問は確認した」という意味で、質問内にリンクを貼っておくと良いですよ。 何も書いていないと何を調べたのか試したのか分かりませんし、 もし既に見たような記事が回答に提示されると二度手間三度手間になることもあります。 また、「調べた内容が正しいのか」「内容の理解が追い付いていないのか」はその記事と質問内容を照合してみないと分かりませんので、必要です。 「質問するときのヒント」にも下記のように書いてあります。 https://teratail.com/help/question-tips#questionTips1-2 >検索して見つけたページでわからない事があれば、どのページのどの部分がわからないのかを明確に記し質問してみてください。
cocomoco

2019/07/04 04:27

ありがとうございます!質問をする前に確認しておくべき事を確認しておりませんでした。お教えいただいたTipsをしっかり確認しておきたいと思います。
guest

回答3

0

こんなかんじで

javascript

1const str="あおいいえ"; 2const pattern=/[あ-お]/g; 3const kagyou=s=>String.fromCharCode(s.charCodeAt(0) + 9); 4const sagyou=s=>String.fromCharCode(s.charCodeAt(0) + 19); 5console.log(str.replace(pattern,kagyou)); 6console.log(str.replace(pattern,sagyou)); 7

投稿2019/07/04 02:43

編集2019/07/04 02:44
yambejp

総合スコア114572

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

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

cocomoco

2019/07/04 06:52

回答ありがとうございます。ちょっと今の私にはレベルが高い回答のようで、試してみたのですが、うまく動作しませんでした。今後また試行錯誤を重ね教えて頂いたことを噛み砕きながら、自分のものにしたいと思います。
ikadzuchi

2019/07/04 11:43

・ぃぅぇぉ→がぎぐげ に変換されてしまう ・た行は行に応用できない という問題点から低評価します。
cocomoco

2019/07/05 02:45

ikadzuchi様 後学のために教えて頂きたいのですが、なぜその様な問題が起こるのか、分かるサイトまたページはありますか?
ikadzuchi

2019/07/05 18:39

これは文字コードを見ると分かります。(Unicodeで)ひらがなは ぁあぃいぅうぇえぉおかがきぎくぐけげこご… のように並んでいるので、「あ」~「お」にマッチする正規表現「[あ-お]」は「ぃ・ぅ・ぇ・ぉ」にもマッチします。 「あ」と「か」、「い」と「き」…の間隔は一定なので単純な加算で算出できますが、これがた行になると ただちぢっつづてでとど… と「っ」が入り、は行は はばぱひびぴ… と半濁点の分で3文字毎になるので、あ行との間隔が一定になりません。 なおよく考えたら、た・は行の2つだけでなく、たなはまやらわ行(つまり他全部)が単純な加算でできませんでした。
cocomoco

2019/07/07 15:56

分かりやすい説明ありがとうございます!とても勉強になりました!
guest

0

ソースコードをあまりしっかり読んでいないので細かいところはご容赦ください。
あくまで一つのアイデアですが、、、

js

1 ... 2 var value = range.getValues();  3 var i = value.length; 4 var s = 0 ; 5 for (s==0;s<i;s++){ 6 if(value[s][0] == user_message){ 7 var reply = value[s][1]; 8 var reply2 = value[s][2]; 9 } 10 } 11 ...

の部分で該当するか行・さ行を取り出そうとしていると思うので、
もし想定外の値が入力されていたとすると、replyreply2が初期化されていない状態になると思います。
なので、この二つの変数が初期化されているかどうかで判断するというのは一つの手ではないでしょうか?
if (reply)みたいに書いたり、for文の外で変数の初期化だけしておいて、値が変わったかどうかなどが具体的な策として考えられます。

つまり、想定外の入力であった場合のif分岐が書ければ、

js

1if (入力が想定内かどうか) { 2 //想定内の場合 3 reply_message = (か行、さ行を返す内容) 4} else { 5 if (message==="こんにちは") { 6 reply_message = (こんにちはの時に返す内容) 7 } else { 8 reply_message = (対象外の時に返す内容) 9 } 10}

のように書けるかと思います。

投稿2019/07/04 02:37

keitatomozawa

総合スコア81

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

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

cocomoco

2019/07/04 06:55

回答有り難うございます。教えていただいたことを試してみましたが、今の私ではうまく動作させることができませんでした。理解できるようこれから精進したいと思います。
guest

0

ベストアンサー

とりあえずorでつなげばいいのでは

js

1if ("あ" == user_message || "い" == user_message || || "う" == user_message || "え" == user_message || "お" == user_message ) { 2 reply_messages = [reply + "\n" + reply2]; 3} 4

まとめたい配列にしておいてindexOfも有用かと思います。

js

1var target = ["あ","い","う","え","お"]; 2 3if(target.indexOf(user_message) >= 0){ 4 reply_messages = [reply + "\n" + reply2]; 5} 6

投稿2019/07/04 02:25

編集2019/07/04 02:29
m.ts10806

総合スコア80765

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

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

cocomoco

2019/07/04 06:49

var target = ["あ","い","う","え","お"]; の部分をスプレッドシートから1次配列で取得したところ やりたいことができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問