How do I bold one line in a Google Docs Script?

3.8k Views Asked by At

I'm writing a script to parse a Google Sheet and format the cells nicely on a Doc. I'd like the cell data from column 1 to always be bold and the cell data from column 6 to always be Italic. The problem is, after appending a paragraph to the document body, the attribute changes are applied to the entire document. Is there a way to bold/italicize the cell data before appending it to the doc body?

function readRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var numCols = rows.getNumColumns();
  var values = rows.getValues();

  var doc = DocumentApp.create("Smogon Formatted");
  var docBody = doc.getBody();

  for (var i = 2; i <= numRows; i++) {

    for (var j = 1; j <= numCols; j++){

        var cellData = rows.getCell(i, j).getValue()

        // Format data based on column
        if (j == 1) {
          docBody.appendParagraph(cellData).editAsText().setBold(true);
        } else if (j == 2 || j == 3) { 
          var imgFormula = rows.getCell(i, j).getFormula();
          var imgUrl = getImageUrl(imgFormula);
          docBody.appendParagraph("[img]" + imgUrl + "[/img]");
        } else if (j == 6) { 
          docBody.appendParagraph(cellData).editAsText().setItalic(true);
        } else { 
          docBody.appendParagraph(cellData);
        }
    }
  }
};

EDIT: Try #2, using the setAttributes method

function readRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var numCols = rows.getNumColumns();
  var values = rows.getValues();

  var doc = DocumentApp.create("Smogon Formatted");
  var docBody = doc.getBody();

  for (var i = 2; i <= numRows; i++) {

    for (var j = 1; j <= numCols; j++){

        var cellData = rows.getCell(i, j).getValue()

        // Format data based on column
        if (j == 1) {
          docBody.appendParagraph(cellData).setAttributes(style1);
        } else if (j == 2 || j == 3) { 
          var imgFormula = rows.getCell(i, j).getFormula();
          var imgUrl = getImageUrl(imgFormula);
          docBody.appendParagraph("[img]" + imgUrl + "[/img]");
        } else if (j == 6) { 
          docBody.appendParagraph(cellData).setAttributes(style2);
        } else { 
          docBody.appendParagraph(cellData);
        }
    }
  }
};

// Style definitions as global variables
var style1= {};
style1[DocumentApp.Attribute.BOLD] = true;
var style2= {};
style2[DocumentApp.Attribute.ITALIC] = true;
1

There are 1 best solutions below

0
On

If you use style attributes you can assign a style to every paragraph very easily, you can actually do it for any document element...

Here is a basic example code to show how it works :
(doc here)

function exportToDoc(){
  var doc = DocumentApp.openById('16i----L53WTDpzuLyhqQQ_E');// or create a new doc (but not while you test it :-)
  var body = doc.getBody();
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  for (var i in values){
    var rowData = values[i].join(' + ');
    if (i == 1) {
      body.appendParagraph(rowData).setAttributes(style2);
    } else if (i == 2 ) { 
      body.appendParagraph(rowData).setAttributes(style1)
    }
  }
  doc.saveAndClose();
}

// Style definitions as global variables
  var style1 = {};// style example 1
  style1[DocumentApp.Attribute.FONT_SIZE] = 10;
  style1[DocumentApp.Attribute.FONT_FAMILY] = DocumentApp.FontFamily.CONSOLAS;
  style1[DocumentApp.Attribute.FOREGROUND_COLOR] = "#444400";
  var style2 = {};// style example 2
  style2[DocumentApp.Attribute.FONT_SIZE] = 16;
  style2[DocumentApp.Attribute.FONT_FAMILY] =DocumentApp.FontFamily.ARIAL_NARROW;
  style2[DocumentApp.Attribute.FOREGROUND_COLOR] = "#005500";
//

example random data result :

enter image description here