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

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

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

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

Q&A

解決済

2回答

1566閲覧

GASで正規表現を使ったreplaceをしたいが処理がスルーされてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2022/12/05 04:57

前提

GoogleスプレッドシートのGASで行き詰っています。

やりたい処理は、セルに入力された文字列を取得して、そのうち全角英数字があればすべて半角英数字に変換する、というものです。
該当のソースコードでは、問題を簡単にするため、変数に直接文字列を入れていますが、このやり方でもできなかったため、ちょっとお手上げだと思い、質問させていただきました。

ごくごく簡単な処理だと思うのですが、なぜかreplaceで変換されずに処理が終わってしまいます。
エラー表示も何もありません。ただ変換されていない文字列がセルに再入力されるような感じです。

実現したいこと

文字列に含まれる全角英数字を、半角英数字に変換する。

該当のソースコード

GAS

1function jikken(){ 2 var text; 3 var jikkenWord = '2ABC'; 4 var replaced; 5 6 if(text = jikkenWord.match(/[A-Za-z0-9]/g)){ 7 replaced = jikkenWord.replace(/[A-Za-z0-9]/g, text).toString(); 8 Logger.log(replaced); // 結果:2ABC 9 } 10}

試したこと

正規表現については、他の解説サイト等からの丸写しなので、そのミスとも思えませんが、念のため[A-Z]だけ等、問題を切り分けてやってみましたが、変換処理が行われませんでした。

何かヒントだけでも構いませんので、どうかよろしくお願いいたします。

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

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

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

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

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

int32_t

2022/12/05 05:02

とりあえず、変数 text に何が入っているのか確認すべきかと思います。
int32_t

2022/12/05 05:07

あとこのコードですと、1文字目の "2" だけは変わりませんか?
退会済みユーザー

退会済みユーザー

2022/12/05 06:14

コメントいただきありがとうございます。 textには4個の配列が入っています。これがまずいのかと思い、replaceの引数にある変数textをtoString()で文字列にしましたが、やはり変換できませんでした。 なんか変数の扱いを根本的に見失っている気がしてきました…。 また、このコードでも1文字目は変わりません。半角になりません。 引き続き、アドバイスいただける方、お願いいたします。
guest

回答2

0

ベストアンサー

コード例

javascript

1function replaceStrFullToHalf() { 2 const originalStr = '2ABC'; 3 const newStr = originalStr.replace(/[A-Za-z0-9]/g, s => String.fromCharCode(s.charCodeAt(0) - 0xFEE0)); 4 Logger.log(newStr); 5}

考え方

  • 文字列には文字コードが割り振られています。
    • そのコードを変更してやることで、全角→半角に変換します。
    • それがこの部分です→String.fromCharCode(s.charCodeAt(0) - 0xFEE0)
    • そして、0xFEE0の部分が番号の差分になります(下記例だと100)。
  • どういう仕組みかというと、
    • 例えば、全角「1」の文字コードが201番で、半角「1」が101番だったとします。
    • 同様に例えば、全角「A」の文字コードが320番で、半角「A」が220番だったとします。
    • いずれも「全角の番号 - 100番」すれば、半角の番号になりますよね。
  • 上記例の全角・半角の番号は適当ですが、実際にも全角・半角の英数字は番号が等間隔で離れているので、
    • 引いてやると、全角→半角
    • 逆に足してやると、半角→全角 にできます。

.replace()メソッドについて

javascript

1元の文字列.replace(パターン, 変換後の文字列)
  • 第一引数は、正規表現(またはただの文字列でも可)で該当する文字列を検索
  • 第二引数は、該当した文字列の変換後の文字列、または変換後の文字列を戻すコールバック関数

javascript

1// 'dog' => 'cat'に変換 2const originalStr1 = 'I am a dog. You are not a dog.'; 3const newStr1 = originalStr1.replace('dog', 'cat'); 4console.log(newStr1); // 'I am a cat. You are not a dog.' 5 6// 母音(aeiou)を大文字に変換 7const originalStr2 = 'I am a dog.'; 8const newStr2 = originalStr2.replace(/[aeiou]/g, s => s.toUpperCase()); 9console.log(newStr2); // 'I Am A dOg.'

質問者様のコードの不具合

  • if()の丸括弧の中には条件式を入れるはずなのに、なぜかif(text = jikkenWord.match(/[A-Za-z0-9]/g)){と、変数に値を代入している。
    • ===の勘違いかとは思いますが、それにしてもおかしいです。
  • .replace()は条件に合致(マッチ)したものを変換してくれるメソッドなので、.match()不要。

投稿2022/12/05 07:19

編集2022/12/05 12:34
Cocode

総合スコア2314

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

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

退会済みユーザー

退会済みユーザー

2022/12/08 04:05

ご回答いただきありがとうございます。 ご提示されたコードは検索した時に見つけたのですが、難しくてスルーしてしまいました。 文字コードの考え方は非常に分かりやすかったです。検索で見つけたコードだけでは意味が分かりませんでした。 replace()メソッドについても、分かりやすくありがとうございます。私の理解が足りていませんでした。replace()意外に使いづらいかも…。 if()の中は確かにおかしいですね。match()メソッドもよく理解しておらず、コピペで使用していました。 改めて調べたところ、jikkenWordに全角が含まれない場合はnullを返すようなので、if(jikkenWord.match(/[A-Za-z0-9]/g) != null)としてみたところ、うまく動きました。 しかし、そもそもmatch()が不要とのご指摘を受け、実際にmatch()を使用しないパターンでやってみたところ、問題無く動きました。 無事解決いたしました。 基本に立ち返って、丁寧に学習していきたいと思います。ありがとうございました。
guest

0

質問文にあるコードは、「jikkenWord にある全角英数字をバラバラに取り出してtext配列に入れて」「jikkenWord にある半角英数字をtext配列を文字列化したもので置き換える」という動作です。半角に変換する処理にはなっていません。

英数字の半角変換は計算でできるので、replace() の第2引数に関数を指定する方針がいいかと思います。「javascript 英数字 半角変換」などで検索してみてください。

投稿2022/12/05 06:22

int32_t

総合スコア20880

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

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

退会済みユーザー

退会済みユーザー

2022/12/05 07:08

ご回答いただきありがとうございます。 やはり動作の流れが全然わかっていませんでした。 勤務日時の都合上、8日まで作業ができないので、情報の検索や試行錯誤がだいぶ先になってしまいますが、どうかお許しください。 ご提案された通り、もう少し自力でやってみます。
退会済みユーザー

退会済みユーザー

2022/12/08 02:19

ネットで見たコードをコピペしただけで、replace()の意味をよく分かっていませんでした。 第2引数の関数に関しては、他の方にご提示されましたので、そちらを参考にさせていただきます。 プログラミングをするにあたって、メソッドや関数や引数の意味といった部分をおろそかにしていたことを反省します。 的確なヒントをありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問