-1

"s/*│*/\ t/g"というテキストを含むGoogleスプレッドシートにセルがあります。GoogleスプレッドシートgetValue([ t]を含むセル)は、タブレーターを返しません。

私が意図した出力が「B」になりますが、私は「\のTB」を取得コード

function minimalExample(){ 
    var text = "a │ b" 

    var pattern = SpreadsheetApp.getActiveSheet().getRange('B3').getValue() // cell contains "s/ *│ */\t/g" 
    var regexSplitter = /s\/(.*)\/(.*)\/(\w+)/;  // pattern to split sed line into search/replace/modifier 
    var patternParts = pattern.match(regexSplitter); // list with search [1], replace [2], modifier [3] 

    text = text.replace(new RegExp(patternParts[1], patternParts[3]),patternParts[2]); 
    Logger.log(text); 

    return true; 
} 

を使用しています。

どのようにこの動作を変更できますか?

+0

なぜ意図した出力が 'B'でしょうか? *これはセルに書かれているものなので、あなたは 'a \ tb'を得ています*。基本的にコードを読み込むパーサは、あなたのコードに入れたタブをタブから外すものです。他の場所からロードされた文字列は魔法のように変換されません。あなたの文字列中の全ての '\ t 'をタブ文字に変換したいなら、' .replace(/ \\ t/g、 "\ t") 'を実行する必要があります。 – CherryDT

+0

次に、 "a b"は_desired_出力になります:) – Nico

答えて

1

私にとっては、あなたのコードは正常に動作します:

[16-05-18 18:20:27:447 CEST] \t is not the same as  

私はあなたの本当のコードが違って見えるとpatternParts[2] == "\t"のような比較を行うと思いますが、文字\tis not the same as後に実際に目に見えないタブは異なりますので。

したがって、物事は逆になります。patternParts[2]は実際に\tを含んでいますが、間違って比較しています。 JavaScriptでは、二重引用符を使用する場合、\n\t\uXXXXなどのエスケープシーケンスを使用できます。だから、

あなたはどちらか、\tpatternParts[2]を比較する単一引用符(patternParts[2] == '\t')を使用するか、またはバックスラッシュ(patternParts[2] == "\\t")を脱出したい場合。

EDIT:あなたの更新の質問によると:あなたは実際のタブに(ちょうどそれらの2つの文字、\tで、何も特別な)セル内のすべての\t Sを変換したい場合は、あなたが行く必要があるでしょうそしてそれらを交換:あなたは置き換える部分はJavaScript互換のエスケープシーケンスを使用している場合

patternParts[2] = patternParts[2].replace(/\\t/g, "\t"); 

が、あなたはまた、JSがそこにすべてのエスケープシーケンスを交換するために、このようなJSON.parse('"' + theString + '"')ようなトリックを使用することができます。そのような浮遊エスケープされていない二重引用符などの無効なものが、あなたの文字列であり、そのために気を付けるならば、これは例外をスローすることに注意してください:

try { 
    patternParts[2] = JSON.parse('"' + patternParts[2] + '"'); 
} catch(e) { 
    // Invalid syntax! Handle the error here somehow 
} 
+0

申し訳ありませんが、私は間違った表現をしており、例はあまりにも小さかったです。私はコードを編集し、意図したものと実際のものを加えたものを加えました。 – Nico

+0

これは素晴らしいです、ありがとうございます! – Nico

関連する問題