Edit: the below endeavor is related to Google Apps Script to format text in a Google Doc.
I’m not familiar with JavaScript and really have only done some small bit of R coding and so this effort is a bit of parsing what I can google as well as some trial and error. I’ve had some promising success, but I’m also having some trouble finding a complete answer to the following scenario.
Context
I have a google doc template that has embedded merge codes. A separate application is pulling data fields from objects and related objects and replacing those merge codes with unformatted text. A side effect of this application is that I cannot format the merge codes ahead of time so that when replaced, the text is formatted appropriately. Therefore I’m trying to create a script to run following text merge to programmatically apply some formatting.
What I Need
I have three different styles I need to apply. I am creating code to search for start tags and end tags and then format the text between. In a perfect world the tags would also then be removed from the document leaving only the formatted text behind.
| Styled Item | Tags | Formatting to be applied |
|---|---|---|
| Requests | <req> </req> |
Roboto 10, Bold, #4a5356 |
| Citations | <cit> </cit> |
Lato 8, Bold, #4A5356 |
| Conclusions | <con> </con> |
Lato 8, Bold, #B38F00 |
Code so Far
function onOpen() {
DocumentApp.getUi().createMenu('Butler')
.addItem('Format Headings', 'FormatRequests')
.addToUi();
}
function FormatRequests() {
var startTag = '<req>';
var endTag = '</req>'
var body = DocumentApp.getActiveDocument().getBody();
var para = body.getParagraphs();
for(var i in para){
var from = para[i].findText(startTag);
var to = para[i].findText(endTag,from);
if((to != null && from != null) && ((to.getStartOffset()-1) - (from.getStartOffset()+startTag.length) > 0) ){
para[i].editAsText().setBold(from.getStartOffset()+startTag.length, to.getStartOffset()-1, true);
}
}
}
So far I’ve succeeded in finding the tags and setting text between the tags to bold. But I don’t know how to continue to apply the remainder of the formatting or how to remove the tags once the formatting has been applied.
Any ideas?
Advertisement
Answer
Try this:
function main() {
handle_tags(['<req>', '</req>'], "Roboto", 10, "Bold", "#4a5356");
handle_tags(['<cit>', '</cit>'], "Lato", 8, "Bold", "#4a5356");
handle_tags(['<con>', '</con>'], "Lato", 8, "Bold", "#B38F00");
}
function handle_tags(tags, family, size, style, color) {
var body = DocumentApp.getActiveDocument().getBody();
var start_tag = tags[0];
var end_tag = tags[1];
var found = body.findText(start_tag);
while (found) {
var elem = found.getElement();
var start = found.getEndOffsetInclusive();
var end = body.findText(end_tag, found).getStartOffset()-1;
elem.setFontFamily(start, end, family);
elem.setFontSize(start, end, size);
elem.setForegroundColor(start, end, color);
switch (style.toLowerCase()) {
case 'bold': elem.setBold(start, end, true); break;
case 'italic': elem.setItalic(start, end, true); break;
case 'underline': elem.setUnderline(start, end, true); break;
}
found = body.findText(start_tag, found);
}
body.replaceText(start_tag, '');
body.replaceText(end_tag, '');
}