2015-10-19 108 views
0

我是新的谷歌文檔腳本。谷歌文檔腳本,搜索和替換文本字符串和更改字體(例如,粗體)

在谷歌文檔

,我需要尋找多個文本字符串(例如,在細體字體「學生1」)替換爲其他文本字符串,這些文本字符串(例如,「學生A」),但在黑體字字體。

搜索和替換,我使用下面的代碼:

function docReplace() { 

    var body = DocumentApp.getActiveDocument().getBody(); 
    // change "student 1" to "Student A" in boldface 
    body.replaceText("student 1", "Student A"); 

} 

上面的代碼只替換「學生1」與「學生A」使用谷歌文檔的當前字體,但我不知道如何將字體從lightface更改爲粗體。

我試圖

body.replaceText("student 1", "<b>Student A</b>"); 
當然

,上面的代碼沒有工作。

任何幫助將不勝感激。謝謝。

回答

1

用另一個替換一個字符串可以通過簡單的查找和替換來完成。

將它們設置爲粗體顯得有些困難,因爲您必須獲取正文的文本元素,並且還要找到每個出現該單詞的開始和結束位置。

由於JS中的正則表達式不返回匹配數組,而是當前匹配的屬性數組,所以您必須循環訪問上次匹配後始終開始的函數。

function docReplace(input, output) { 
    var re = new RegExp(output,"g"); 
    var body = DocumentApp.getActiveDocument().getBody(); 
    body.replaceText(input, output); 

    var text = body.getText(); 
    var index; 
    while(true){ 
    index = re.exec(text) 
    if(index == null){break} 
    body.editAsText().setBold(index.index, output.length + index.index, true); 
    } 
} 
+0

謝謝,羅賓。追加.setBold(true)的問題是整個文檔被設置爲粗體,而不是**我想要的。我只想將替換文本「** Student A **」設置爲粗體,而文檔中的其餘部分保持原樣。 –

+0

請檢查更新後的函數,它將輸入轉換爲輸出並使其全部出現爲粗體。 –

+0

謝謝,羅賓。你的新代碼更加優雅和先進,而且我正在迷失如何使用它。我沒有看到代碼中的任何地方,我可以用粗體文本「** Student A **」替換文本「student 1」。也許,我應該將輸入設置爲「學生1」並輸出爲「學生A」。是的,沒錯,我明白了。你的代碼確實有效。 –

2

一行人的方式來替換文本字符串(例如,「學生1」),通過一個新的文本字符串有一個谷歌文檔許多事件(例如,「學生A」)粗體,是兩個步驟:

1-寫的函數(稱爲,比方說,docReplace)執行搜索和在常規/正常字體替換(無粗體):

function docReplace() { 

    var body = DocumentApp.getActiveDocument().getBody(); 
    // change "student 1" to "Student A" 
    body.replaceText("student 1", "Student A"); 

} 

2-寫的函數(稱爲,說,boldfaceText)來搜索所需的文本(例如「學生A」)和兩個偏差值用於該文本(即,開始偏移和endOffsetInclusive)在每次出現時可設置到粗體這些偏移值中的字符的字體:

function boldfaceText(findMe) { 

    // put to boldface the argument 
    var body = DocumentApp.getActiveDocument().getBody(); 
    var foundElement = body.findText(findMe); 

    while (foundElement != null) { 
    // Get the text object from the element 
    var foundText = foundElement.getElement().asText(); 

    // Where in the Element is the found text? 
    var start = foundElement.getStartOffset(); 
    var end = foundElement.getEndOffsetInclusive(); 

    // Change the background color to yellow 
    foundText.setBold(start, end, true); 

    // Find the next match 
    foundElement = body.findText(findMe, foundElement); 
    } 

} 

爲boldfaceText上述代碼被從在後Finding text (multiple times) and highlighting啓發。

字符的偏移量值只是描述該字符在文檔中的位置的整數,第一個字符的偏移值爲1(它就像字符的座標)。

使用「學生A」作爲參數用於向功能boldfaceText一個呼叫,即,

boldfaceText("Student A"); 

其可嵌入到功能docReplace,即,

function docReplace() { 

    var body = DocumentApp.getActiveDocument().getBody(); 
    // change "student 1" to "Student A" 
    body.replaceText("student 1", "Student A"); 

    // set all occurrences of "Student A" to boldface 
    boldfaceText("Student A"); 

} 
在谷歌文檔

,只需運行該腳本docReplace改變「學生1」所有出現到「學生A」黑體。

上述兩個函數(docReplace和boldfaceText)可能是將新手(如我)引入Google文檔腳本的好方法。經過一段時間玩谷歌文檔腳本,以獲得一些熟悉,學習羅賓的更優雅和先進的代碼,一次完成上述兩個步驟。

+0

做得好盧克,這個解決方案根本不算先進,如果你不發表評論,它可能會帶你相同數量的線。做好自己的工作併爲自己找到答案,我相信你從我的解決方案中學到了更多的東西,我可以從中學到很多東西(我自己學到了很多東西,因爲我沒有爲Google Docs編寫任何宏,所以我的解決方案可以可能也會被優化)。我只想讓你接受我們的答案(無論你認爲哪一個更好)作爲答案,以便未來的人們能夠輕鬆地走上正確的軌道。 –

+0

謝謝羅賓,徵求意見。我會偏向我選擇一個「更好」的答案,因爲它需要我一段時間才能理解你的代碼。如果您可以指向某些網頁來解釋您的代碼的某些元素的語法,例如「新的RegExp(輸出,」g「)」,「re.exec(文本)」,那麼學習您的代碼會非常有幫助,「index.index」等。我的猜測是可以找到Java Script(JS)語言的語法。也許你從哪裏開始學習JS有一些很好的建議。謝謝。 –

+0

如果您認爲自己的方式更易於理解,那麼使用接受您的答案是合理的。學習的最佳方式是製作一個項目並嘗試使其工作。不要氣餒,JS和GAS有一千種方法去做一件事情,這使得它們非常有表現力,但也有時會讓人困惑,所以如果你看到的解決方案與你想象的不同,不要氣餒。 GAS參考有一些優秀的指導(https://developers.google.com/apps-script/overview)對於一般的Javascript,您可以嘗試codeacademy。希望這有助於 –