【GAS】replaceで指定した文字列が一つしか置換されない原因と対処法【備忘録】

GAS
スポンサーリンク

GAS勉強中にreplaceで指定した文字列が一つしか置換されずに困ったことがあったので、今回はその原因と対処法を備忘録も兼ねて紹介したいと思います。

スポンサーリンク

replaceで指定した文字列が一つしか置換されない原因と対処法

やろうとしたこと

Parser.data~iterate()でスクレイピングで取得したテーブルデータを配列に格納するというのをやっていたのですが、その際テーブルのセルがブランクだと配列の数がズレてしまう為、ブランクのセルを―(ダッシュ)で置換したい、といった感じです。

target_html = "<table>" +
                "<tr>" + 
                  "<th>名前</th>" +
                  "<td>はりぼな</td>" +
                "</tr>" +
                "<tr>" + 
                  "<th>性別</th>" +
                  "<td>男</td>" +
                "</tr>" +
                "<tr>" + 
                  "<th>年齢</th>" +
                  "<td>20</td>" +
                "</tr>" +
                "<tr>" + 
                  "<th>電話番号</th>" +
                  "<td></td>" +
                "</tr>" +
                "<tr>" + 
                  "<th>メールアドレス</th>" +
                  "<td>haribona@testmail.com</td>" +
                "</tr>" +
              "</table>";
  let table_Header = Parser.data(target_html).from('<th>').to('</th>').iterate();
  let table_Data = Parser.data(target_html).from('<td>').to('</td>').iterate();

  Logger.log("th:["+ table_Header + "]");
  Logger.log("td:[" + table_Data + "]");

//th:[名前,性別,年齢,電話番号,メールアドレス]
//td:[はりぼな,男,20,haribona@testmail.com]

例えば上記の場合、ヘッダーセル(th)は5件データがありますが、データセル(td)は電話番号がブランクになっており4件しかデータがありません。

<th>名前</th>
<th>性別</th>
<th>年齢</th>
<th>電話番号</th>
<th>メールアドレス</th>
→5件
<td>はりぼな</td>
<td>男</td>
<td>20</td>
<td></td>
<td>haribona@testmail.com</td>
→4件

こうすると電話番号の所に次のデータセルのデータ(haribona@testmail.com)が入ってしまい配列にズレが生じてしまうので、予めセルがブランクであれば中に何らかの文字を入れてズレるのを防ぎたい、といったイメージです。

上手くいかなかったコード

ブランクセルに―(ダッシュ)を入れるのにreplaceを使用して置換するようにしました。

//HTMLに対して実行
target_html = target_html.replace("<td><\/td>","<td>―<\/td>")

これで解決したかと思いきや、上記の例のようにブランクセルが1件だけなら上手くいったのですが、2件以上ブランクセルがあると最初の1件しか置換されませんでした

例えば、電話番号セルだけでなくメールアドレスセルもブランクだった場合、replaceを実行しても電話番号セルしか置換されない、みたいな感じです。

//replace実行前
<td>はりぼな</td>
<td>男</td>
<td>20</td>
<td></td>
<td></td>

//replace実行後(1つしか置換されない)
<td>はりぼな</td>
<td>男</td>
<td>20</td>
<td>―</td>
<td></td>

原因

置換対象を"<td><\/td>"にしていたのが原因でした。
これだと空になっているタグが複数あっても、最初に見つかったものしか置換されないみたいです

//一つしか置換されない
target_text = target.replace("<td><\/td>","<td>―<\/td>")

対処法

置換対象を"<td><\/td>"から/<\/td>/gに変更することで解決しました。
変更した部分は””で囲んでいたのを/(半角スラッシュ)にしたのと末尾にオプションであるgを付けたことです。

要は正規表現に変更した、ってことですね。

//対象文字列が全て置換される
target_text = target.replace(/<td><\/td>/g,"<td>―<\/td>")

こうすることで一致した全ての箇所を置換することが出来ました。

スポンサーリンク

まとめ

今回はreplaceで指定した文字列が一つしか置換されない原因と対処法を紹介しました。

もしreplaceで一か所しか置換されない時は正規表現で指定しているか確認してみましょう。

今後もGASで詰まった等を不定期で更新していきますので、良ければご覧ください!

コメント

タイトルとURLをコピーしました