在光标处插入一块预先格式化的文本

时间:2017-10-27 09:52:23

标签: google-apps-script google-docs

我试图在我写的文档中自动执行一些无聊的操作。

我希望能够在光标位置插入如下内容:

HEADING3

一些文字

BOLD_TEXT1

2x2表

BOLD_TEXT2

2x2表

BOLD_TEXT2

2x2表

其中BOLD_TEXT具有相同的样式(即文本尺寸14,灰色和全部大写),并且该表是页面范围的并且第一行着色(即绿色),而第二列具有背景颜色的第二行。 / p>

有可能不生气吗?我没有在GAS文档中找到一些有效的例子。

2 个答案:

答案 0 :(得分:2)

是的,这可能不会生气。这是一个函数,它定位当前元素,然后在它之后插入一堆东西。

找到当前元素

首先,在光标位置获取元素,然后递归获取其父元素,直到达到Body级别。这是必要的,因为必须在Body中插入新的段落和表格。

定义样式

创建一个空对象,然后定义DocumentApp.Attribute.BACKGROUND_COLOR之类的listed here属性。使用setAttributes方法应用于元素。

插入元素

使用Body方法insertParagraphinsertTable完成。由于该表涉及一些自定义格式,因此将其分为函数insertMyTable。显然,不能将背景颜色应用于行,因此这是在单元级别完成的。单元格的行/列索引是从0开始的。

整页表格

我发现制作表格全宽的唯一方法是从页面宽度和边距计算所需的单元格宽度,并在单元格上设置此宽度。这可能会稍微偏离,因为细胞边界有宽度,但我决定不关心。

最终结果:

screenshot

为方便使用,onOpen函数将创建一个菜单项Custom>每次打开文档时插入东西。

function insertStuff() {
  var body = DocumentApp.getActiveDocument().getBody();
  var cursor = DocumentApp.getActiveDocument().getCursor();
  if (cursor) {
    var element = cursor.getElement();
    while (element.getParent().getType() != DocumentApp.ElementType.BODY_SECTION) {
      element = element.getParent();
    }
    var index = body.getChildIndex(element);
  }
  else {
    DocumentApp.getUi().alert("Could not find current position");
    return;
  }

  var boldStyle = {};
  boldStyle[DocumentApp.Attribute.BOLD] = true;
  boldStyle[DocumentApp.Attribute.FOREGROUND_COLOR] = "#555555";
  boldStyle[DocumentApp.Attribute.FONT_SIZE] = 14;

  body.insertParagraph(index + 1, "Heading3").setHeading(DocumentApp.ParagraphHeading.HEADING3);
  body.insertParagraph(index + 2, "some text");
  body.insertParagraph(index + 3, "bold text 1").setAttributes(boldStyle);
  insertMyTable(body, index + 4);
  body.insertParagraph(index + 5, "bold text 2").setAttributes(boldStyle);
  insertMyTable(body, index + 6);
  body.insertParagraph(index + 7, "bold text 3").setAttributes(boldStyle);
  insertMyTable(body, index + 8);
}

function insertMyTable(body, index) {
  var topCellStyle = {};
  topCellStyle[DocumentApp.Attribute.BACKGROUND_COLOR] = "#00FF00";
  var bottomRightCellStyle = {};
  bottomRightCellStyle[DocumentApp.Attribute.BACKGROUND_COLOR] = "#0000FF";

  var table = body.insertTable(index, [["", ""], ["", ""]]);
  table.getCell(0, 0).setAttributes(topCellStyle);
  table.getCell(0, 1).setAttributes(topCellStyle);
  table.getCell(1, 1).setAttributes(bottomRightCellStyle);
  var cellWidth = (body.getPageWidth() - body.getMarginLeft() - body.getMarginRight())/2;
  table.getCell(0, 0).setWidth(cellWidth);
  table.getCell(0, 1).setWidth(cellWidth);
}


function onOpen() {
  DocumentApp.getUi().createMenu("Custom").addItem("Insert stuff", "insertStuff").addToUi();
}

答案 1 :(得分:1)

插入带格式的文本

  

这是将格式化文本插入文档的简单解决方案。它还包括带有文本区域和提交按钮的简单侧栏的html。

这是gs代码:

import kotlin.jvm.JvmStatic

object Hello {
    @JvmStatic
    public fun main(args: Array<String>) {
        println("Hello, world!" + args[0])
    }
}

这将显示侧栏:

function insertTextAtCursor(txt)
{
  var retAddrStyle={};
  retAddrStyle[DocumentApp.Attribute.FONT_FAMILY] = 'Calibri';
  retAddrStyle[DocumentApp.Attribute.FONT_SIZE] = 14;
  retAddrStyle[DocumentApp.Attribute.BOLD] = true;
  retAddrStyle[DocumentApp.Attribute.LINE_SPACING]=1;
  retAddrStyle[DocumentApp.Attribute.HORIZONTAL_ALIGNMENT]=DocumentApp.HorizontalAlignment.LEFT;
  retAddrStyle[DocumentApp.Attribute.MARGIN_TOP]=0;
  var doc=DocumentApp.getActiveDocument().getCursor().insertText(txt).setAttributes(retAddrStyle);
  return true;
}

这是侧边栏的html(inserttext.html):

function loadParagraphSidebar()
{
  var html=HtmlService.createHtmlOutputFromFile('inserttext').setTitle('Insert Text');
  DocumentApp.getUi().showSidebar(html);
}
  

补充工具栏:

enter image description here

  

插入之前:

enter image description here

  

插入后:

enter image description here