2017-02-18 10 views
0

をフォーマット保つのは、私たちがgoogle documentの最初の段落を持っていると仮定しましょう:Google Appsのスクリプトに:部分的にのみ一致するものをドキュメントに置き換えると

Wo1rd最後単語so2me言葉he3re。我々は、テキストの一部をsearch and replaceする必要があるが、我々は部品や我々が私達の形式(太字、斜体、色を失ってはならないことだけを変えようにそれは、だけで歴史で強調表示されている必要があり

等)。

私がその瞬間に持っているもの:capturing groupsは、文書に記載されているようにreplaceText()で機能しませんでした。純粋なjs replace()を使用できますが、文字列にのみ使用できます。私たちのGoogleドキュメントは文字列ではなくオブジェクトの配列です。だから、私は多くの試行をして、このコードで後でこのコードに止めました。

ビートできません:私が見つけたものの一部だけを置き換えることができます。グループをキャプチャすることは非常に強力で適切な手段ですが、私はそれを置換に使うことはできません。彼らは動作しませんでしたまたは私は完全な段落を置き換えることができます、それは段落を置き換えることができますが、段落がフォーマットを失うことになる歴史のエディションのために受け入れられない全体の段落を置き換えることができます。私たちが探しているものが各段落にある場合はどうでしょうか?ただし、1文字だけを変更する必要がありますか?私たちは歴史の中で完全な文書の置き換えを見て、本当に変わったものを見つけるのは難しいでしょう。

最初のアイデアは、段落の内容を私に渡して、記号の後に記号を置き換えて、別のものを置き換えるという文字列を比較することでしたが、私たちが手紙が変わった。しかし、置き換えによって一部の単語が削除/追加された場合、その単語をどのように同期させることができますか?それはもっと大きな問題になるだろう。

私が見つけて3倍の時間を読み取ったすべてのトピックは役に立たず、死んだ点から私を動かさなかった。

この問題を解決する方法はありますか?

function RegExp_test() { 
    var docParagraphs = DocumentApp.getActiveDocument().getBody().getParagraphs(); 
    var i = 0, text0, text1, test1, re, rt, count; 

    // equivalent of .asText() ??? 
    text0 = docParagraphs[i].editAsText(); // obj 
    // equivalent of .editAsText().getText(), .asText().getText() 
    text1 = docParagraphs[i].getText();  // str 

    if (text1 !== '') { 
    re = new RegExp(/(?:([Ww]o)\d(rd))|(?:([Ss]o)\d(me))|(?:([Hh]e)\d(re))/g); // v1 
// re = new RegExp(/(?:([Ww]o)\d(rd))/);   // v2 

    count = (text1.match(re) || []).length;  // re v1: 7, re v2: 3 

    if (count) { 
     test1 = text1.match(re); // v1: ["Wo1rd", "Wo", "rd", , , , , ] 
//  for (var j = 0; j < count; j++) { 
//  test1 = text1.match(re)[j]; 
//  } 

     text0.replaceText("(?:([Ww]o)\\d(rd))", '\1-A-\2'); // GAS func 
     // #1: \1, \2 etc - didn't work: " -A- word so2me word he3re last." 
     test1 = text0.getText(); 

     // js func, text2 OK: "Wo1rd word so-B-me word he3re last.", just in memory now 
     text1 = text1.replace(/(?:([Ss]o)\d(me))/, '$1-B-$2'); // working with str, not obj 
     // rt OK: "Wo1rd word so-B-me word he-C-re last." 
     rt = text1.replace(/(?:([Hh]e)\d(re))/, '$1-C-$2'); 

     // #2: we used capturing groups ok, but replaced whole line and lost all formatting 
     text0.replaceText(".*", rt); 
     test1 = text0.getText(); 
    } 
    } 
    Logger.log('Test finished') 
} 

答えて

0

解決策が見つかりました。これは基本的には十分ですが、キャプチャグループのすべての発生を修正し、検出したり、ミックスしたりする、より複雑な手順のベースになることもあります。

function replaceTextCG(text0, re, to) { 
    var res, pos_f, pos_l; 
    var matches = text0.getText().match(re); 
    var count = (matches || []).length; 

    to = to.replace(/(\$\d+)/g, ',$1,').replace(/^,/, '').replace(/,$/, '').split(","); 
    for (var i = 0; i < count; i++) { 
    res = re.exec(text0.getText()) 
    for (var j = 1; j < res.length - 1; j++) { 
     pos_f = res.index + res[j].length; 
     pos_l = re.lastIndex - res[j + 1].length - 1; 
     text0.deleteText(pos_f, pos_l); 
     text0.insertText(pos_f, to[1]); 
    } 
    } 
    return count; 
} 

function RegExp_test() { 
    var docParagraphs = DocumentApp.getActiveDocument().getBody().getParagraphs(); 
    var i = 0, text0, count; 

    // equivalent of .asText() ??? 
    text0 = docParagraphs[i].editAsText(); // obj 
    if (text0.getText() !== '') { 
    count = replaceTextCG(text0, /(?:([Ww]o)\d(rd))/g, '$1A$2'); 
    count = replaceTextCG(text0, /(?:([Ss]o)\d(me))/g, '$1B$2'); 
    count = replaceTextCG(text0, /(?:([Hh]e)\d(re))/g, '$1C$2'); 
    } 
    Logger.log('Test finished') 
} 
関連する問題