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

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

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

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

Q&A

解決済

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

maznomi
maznomi

総合スコア1

Google Apps Script

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

2回答

0グッド

0クリップ

333閲覧

投稿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]だけ等、問題を切り分けてやってみましたが、変換処理が行われませんでした。

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

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

int32_t

2022/12/05 05:02

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

2022/12/05 05:07

あとこのコードですと、1文字目の "2" だけは変わりませんか?
maznomi

2022/12/05 06:14

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

回答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

総合スコア2245

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

maznomi

2022/12/08 04:05

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

0

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

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

投稿2022/12/05 06:22

int32_t

総合スコア17265

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

maznomi

2022/12/05 07:08

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

2022/12/08 02:19

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Google Apps Script

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