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

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

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

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

Q&A

2回答

792閲覧

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

ishikoro.1234

総合スコア14

Google Apps Script

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

0グッド

0クリップ

投稿2019/05/24 08:09

編集2019/05/29 04:11

前提・実現したいこと

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

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

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

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

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

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

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

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

Google

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

###試みたこと・当該のコード
ネットで文字を置き換えるコードを検索し、実現したいコードにアレンジしてみました。
.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; }

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

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

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

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

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

papinianus

2019/05/28 14:55

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

2019/05/29 02:37

いつもお世話になっております。 説明が不足しており、申し訳ございません。 辞書につきましては、指定範囲(ブック名、シート名、列を指定)にて辞書のA列にある文字を順番に検索を行い、検索した際に対応するB列の文字を置き換えたいと思います。 それとは別に、数値表現を含む少数の特定のパターンを正規表現で置換たいです。
papinianus

2019/05/29 03:43

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

2019/05/29 03:54

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

回答2

0

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

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

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

javascript

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

投稿2019/06/19 14:47

papinianus

総合スコア12705

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

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

0

動作確認する気なし

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

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

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

javascript

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

投稿2019/05/28 15:15

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問