【GAS】文章中の数字だけを下付き文字にする方法

GAS

どうもcoto.です。
今回は、テキスト中の数字(0-9)のみを見つけて書式を設定する方法の紹介です。

分子式 C12H20NO の数字部分を下付き文字にしてみます。

まずはコード

function numberOnly() {
  var doc    = DocumentApp.openById('ドキュメントのID'); //ドキュメントのID
  var body   = doc.getBody();                          //本文を取得
  
  let number  = /\d/g;                          //「数字0~9のどれか」を表す正規表現
  var text    = 'C12H20NO'                      //書式変換したい文字列
  var paragraph = body.appendParagraph(text);  //新しい段落にtextで定義した文字列を追加
     let hit;                                                                           
     while(hit = number.exec(text)){            //数字を1つずつ探していく
        if (hit >= 0){
        let hit2 = number.lastIndex-1;          //数字と判断された文字の文字列内の位置を取得
        paragraph.editAsText().setTextAlignment(hit2, hit2,DocumentApp.TextAlignment.SUBSCRIPT); }//取得した位置の数字を下付き文字にする     
        }  
}

少し説明

ポイントは5行目の数字、つまり「0~9のどれか」をまとめて指定する
正規表現 /\d/g を正しく記述すること。 
(\は円マークに見えているかもしれませんが元はバックスラッシュです。)

あってるはずなのに、と言う場合はgを付けたりはずしたりすると
どちらかで上手くいくことが多いです。

きちんと理解している方にとっては当たり前でしょうが…。

結果は以下のようになります。

数字のみを下付き文字に設定する

もちろん正規表現部分を変えれば、指定対象を数字ではなく
半角アルファベットのみ、などに変更できます。

また、今回はかなり細かくvarやletなどの宣言を入れていますが、
適宜増減してください。

商品コードなど数字の桁数や、文字列中に数字が入る位置が決まっている場合は
もっとシンプルにできると思います。

サイズ、色、太字などその他書式設定の方法はこちらのページで紹介しています。

御託

私の場合、分子式の数字をまとめて下付き文字にするのが目的でした。

まず正規表現って何?からはじまったので、
いっそのこと0~9をそれぞれ検索するようにしたほうが速いか?
などとなかなかに躓きまして。

書籍や他のサイトと比べてもあってるはずなのになぜか発動しないー
ということ多々ありますよね。

上手くいかない箇所が上手く走ったときの達成感が
プログラミングの楽しいところですけども。

達成感と絶望がすごく短いスパンで繰り返されるのも特性なのかな
などと素人ながら感じております。

ともかく、同じように躓いている方のお役に立てれば幸いです。

コメント

  1. インデントが正しくないので、読みにくいです。
    12行目の末尾の
    }
    があるので、
    10行目のifの
    {
    は閉じています。
    従って、14行目のインデントは9行目のwhileと同じにすべきです。
    11行目の先頭は、10行目のifよりも右にした方が正式です。
    なお、GASではデフォルトのインデントは2文字のようです。

    • ご指摘ありがとうございます。なるほど、勉強になります。
      昔書いたコードを手直ししようと開いたら見にくい!なんてこともよくあるので…
      独学では、なんとか機能しているような形はできても「きちんとした」ものを作るのはなかなか難しいですね。
      精進します。