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

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

ただいまの
回答率

88.22%

GASで正規表現式で指定した条件と一致した文字列を別の文字列に置換えたいです

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,194

ishikoro.1234

score 14

前提・実現したいこと

業務上で翻訳作業が多いため、効率化を向上させるためにGoogle Apps Scriptで、指定列のデータを正規表現式で条件と一致した文字列を一括置換えるコードを作りたいです。
今回は関数を二つ、作成して行きたいと思います。
①指定した条件で回数や数値、計算式表現を含む少数の特定のパターンを正規表現で置き換える関数
②予めに作成した用語集を使って、指定範囲(ブック名、シート名、列を指定)にて辞書のA列にある文字を順番に検索を行い、検索した際に対応するB列の文字を置き換える関数

①につきまして、翻訳の文章は数値表記、難易度や表記、色付けや改行などの計算式を含む文章が多いです。
そのため、それ以外の文章を略せば、難易度のみ異なる文章を一括に翻訳することができ、効率が捗ります。、自動的に任務名、回数、難易度を記憶し一括に別の書き方の文章に置換えたいです。

例)完成X回〇〇任務【任務難易度表記】 (翻訳する内容)
【難易度表記】○○任務をX回クリア (置換え内容)

正規表現式を使用すれば、回数などは\dで検索でき、難易度表記や計算式などは英数字か括弧などで検索できると思い、コードを作成しましたが実行しても何も反応なかったため、質問させていただきました。

シートの書式的に、最初の行は必ず言語の表記を記入する欄がございますので、もし可能であれば特定の条件指定でその列(翻訳する列)の全てのデータを取得するようにしたいです。
例)一列目が「日本語」の場合、当該の行のデータを2列目から最終列まで取得して処理を行う形

ご教授頂ければ幸いでございます。

特定の文字列を置換えるソースコード

正規表現式で取得した文字の中に、数字などの取得方法がわからず、せめては固定の文章を一括に置き換えるように書いてみましたが、コードを実行しても何も起こらなかったです。

function myFunction() {
var SS = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var range = SS.getActiveRange(); //文字変換を行うの列を選択
const value = range.getValues()[i]; //翻訳する数値
var lvch = ["【精良级】","【精英級】","【史詩】","【伝説】"];  //中国語の難易度表記
var lvjp = ["「初級」","「中級」","「上級」","「伝説」"]; //日本語の難易度表記
  const autochange_value = [] ;
 for(var i = 1;i <= range.length; i++)
   if (value[i]= /完成\d+次.*任务/&lvch[i]) { //正規表現式で変換する文字列を取得
     autochange_value.push(value[i]);
     autochange_value = autochange_value.replace(value,'任務'&lvjp&'を:10回完成する') ;
 }
}

試みたこと・当該のコード

ネットで文字を置き換えるコードを検索し、実現したいコードにアレンジしてみました。
.foreachやfunction(e)などの書き方もしてみましたが、エラーがでていて、それで今のような書き方をしましたが、実行しても何も起こらなかったです。

function myFunction() {
var str = ‘金曜日はカレーの日’;
var rep = /金.*?は/;
str = str.replace(rep, ‘毎日が’);
Browser.msgBox(str);
}

 用語集のデータを取得するコード

用語集のデータを配列として取得できましたが、どう利用すればいいのかご教授頂ければ幸いです、

function getValue() {
var ss = SpreadsheetApp.openById('用語集リンクID');
var sheet = ss.getSheetByName('dict');
  var CH_column = 1,  //対象列の指定
      lastRow = sheet.getLastRow(),  //最終列を取得
      CH_Range = sheet.getRange(1,CH_column,lastRow,1),  //範囲を取得
      CH_Values = CH_Range.getValues(),  //データを取得
      CH_Values = [].concat.apply([],CH_Values);
  var JP_column = 2,
      JP_Range = sheet.getRange(1,JP_column,lastRow,1),  //範囲を取得
      JP_Values = JP_Range.getValues(),  //データを取得
      JP_Values = [].concat.apply([],JP_Values);
 Logger.log(CH_Values);
 Logger.log(JP_Values);
 return CH_Values;
 return JP_Values;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2019/05/28 23:55

    > 用語集のデータを配列として取得できましたが、どう利用すればいいのか
    こちらがききたいです。数値表現を含む少数の特定のパターンを正規表現置換することと、辞書で固定パターンを多数置換するのははなしが違います

    キャンセル

  • ishikoro.1234

    2019/05/29 11:37

    いつもお世話になっております。
    説明が不足しており、申し訳ございません。

    辞書につきましては、指定範囲(ブック名、シート名、列を指定)にて辞書のA列にある文字を順番に検索を行い、検索した際に対応するB列の文字を置き換えたいと思います。

    それとは別に、数値表現を含む少数の特定のパターンを正規表現で置換たいです。

    キャンセル

  • papinianus

    2019/05/29 12:43

    本文に追記することをおすすめします。回答は考えなおします

    キャンセル

  • ishikoro.1234

    2019/05/29 12:54

    この度は説明に不足があり、お手数をお掛けしてしまい、誠に申し訳ございません。
    本文に説明を補足して参ります。

    キャンセル

回答 2

0

動作確認する気なし

'dict'シートが正規表現妥当な文字列であり、A,B列の件数が一致しているならこのまま適用可能
ただ件数が多いと時間がかかりすぎて使えないでしょう。

また、言語を判定して※のところを逆に(zip(lvjp,lvch)、ただし正規表現置換において検索キーと置換文字列は構造的に入れ替え可能でないので、逆形式のペアを持つ必要がある)すれば、逆翻訳も可能

いずれにしても仕様がブレたので的確な回答は難しいですね

function q191163() {
    const lvch = ["完成(\d+?回)(\w+?)任務【精良级】","完成(\d+?回)(\w+?)任務【精英級】","完成(\d+?回)(\w+?)任務【史詩】","完成(\d+?回)(\w+?)任務【伝説】"];  //中国語の難易度表記
    const lvjp = ["「初級」$2任務を$1クリア","「中級」$2任務を$1クリア","「上級」$2任務を$1クリア","「伝説」$2任務を$1クリア"]; //日本語の難易度表記
    const glo = zip(lvch, lvjp) //※
    glo.forEach(function(e){ SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().createTextFinder(e[0]).useRegularExpression(true).replaceAllWith(e[1]) })
}
function zip(zh, jp) {
    return zh.map(function(e,i) { return [e, jp[i]]} )
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コードは単純です
'dict'シートは必ずA列にもとの単語、B列にかえる単語を入れます。
具体的にいうと

A B
今日 今天
今天 今日
完成(\d+?回)(\w+?)任務【精良级】 「初級」$2任務を$1クリア
「初級」(\w+?)任務を(\d+?回)クリア 完成$1$2任務【精良级】

同じ意味の単語は必ずペア登録します
また正規表現妥当な文字にします

function getValue() {
    return SpreadsheetApp.openById('用語集リンクID').getSheetByName('dict').getValues();
}
function q191163() {
    const glo = getValue();
    glo.forEach(function(e){ SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getDataRange().createTextFinder(e[0]).useRegularExpression(true).replaceAllWith(e[1]) })
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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