function ConvertGoogleDocToCleanHtml() { var body = DocumentApp.getActiveDocument().getBody(); var numChildren = body.getNumChildren(); var output = []; var images = []; var listCounters = {}; // Walk through all the child elements of the body. for (var i = 0; i < numChildren; i++) { var child = body.getChild(i); output.push(processItem(child, listCounters, images)); } var html = output.join('\r'); emailHtml(html, images); //createDocumentForHtml(html, images); } function emailHtml(html, images) { var attachments = []; for (var j=0; j): if (gt === DocumentApp.GlyphType.BULLET || gt === DocumentApp.GlyphType.HOLLOW_BULLET || gt === DocumentApp.GlyphType.SQUARE_BULLET) { prefix = '"; } else { // Ordered list (
    ): prefix = "
    1. ", suffix = "
    2. "; } } else { prefix = "
    3. "; suffix = "
    4. "; } if (item.isAtDocumentEnd() || (item.getNextSibling() && (item.getNextSibling().getType() != DocumentApp.ElementType.LIST_ITEM))) { if (gt === DocumentApp.GlyphType.BULLET || gt === DocumentApp.GlyphType.HOLLOW_BULLET || gt === DocumentApp.GlyphType.SQUARE_BULLET) { suffix += ""; } else { // Ordered list (
        ): suffix += "
      "; } } counter++; listCounters[key] = counter; } output.push(prefix); if (item.getType() == DocumentApp.ElementType.TEXT) { processText(item, output); } else { if (item.getNumChildren) { var numChildren = item.getNumChildren(); // Walk through all the child elements of the doc. for (var i = 0; i < numChildren; i++) { var child = item.getChild(i); output.push(processItem(child, listCounters, images)); } } } output.push(suffix); return output.join(''); } function processText(item, output) { var text = item.getText(); var indices = item.getTextAttributeIndices(); if (indices.length <= 1) { // Assuming that a whole para fully italic is a quote if(item.isBold()) { output.push('' + text + ''); } else if(item.isItalic()) { output.push('
      ' + text + '
      '); } else if (text.trim().indexOf('http://') == 0) { output.push('' + text + ''); } else if (text.trim().indexOf('https://') == 0) { output.push('' + text + ''); } else { output.push(text); } } else { for (var i=0; i < indices.length; i ++) { var partAtts = item.getAttributes(indices[i]); var startPos = indices[i]; var endPos = i+1 < indices.length ? indices[i+1]: text.length; var partText = text.substring(startPos, endPos); Logger.log(partText); if (partAtts.ITALIC) { output.push(''); } if (partAtts.BOLD) { output.push(''); } if (partAtts.UNDERLINE) { output.push(''); } // If someone has written [xxx] and made this whole text some special font, like superscript // then treat it as a reference and make it superscript. // Unfortunately in Google Docs, there's no way to detect superscript if (partText.indexOf('[')==0 && partText[partText.length-1] == ']') { output.push('' + partText + ''); } else if (partText.trim().indexOf('http://') == 0) { output.push('' + partText + ''); } else if (partText.trim().indexOf('https://') == 0) { output.push('' + partText + ''); } else { output.push(partText); } if (partAtts.ITALIC) { output.push(''); } if (partAtts.BOLD) { output.push(''); } if (partAtts.UNDERLINE) { output.push(''); } } } } function processImage(item, images, output) { images = images || []; var blob = item.getBlob(); var contentType = blob.getContentType(); var extension = ""; if (/\/png$/.test(contentType)) { extension = ".png"; } else if (/\/gif$/.test(contentType)) { extension = ".gif"; } else if (/\/jpe?g$/.test(contentType)) { extension = ".jpg"; } else { throw "Unsupported image type: "+contentType; } var imagePrefix = "Image_"; var imageCounter = images.length; var name = imagePrefix + imageCounter + extension; imageCounter++; output.push(''); images.push( { "blob": blob, "type": contentType, "name": name}); }