使用GAS复制Google文档标题格式

时间:2016-11-22 19:05:29

标签: google-apps-script

我正在尝试将作为模板的活动文档中的页眉/页脚复制到新创建的文档。我能够轻松地获得文本,但我无法获得格式,字体或水平对齐。

我的理论是,我可以做类似

的事情
newDocHeader.setAttributes(activeDocHeader.getAttributes());

但是,我仍然只能看到左对齐的纯文本。检查标题上的attributes对象时,我得到以下内容:

({
    FONT_SIZE:null, 
    ITALIC:null, 
    STRIKETHROUGH:null, 
    FOREGROUND_COLOR:null, 
    BOLD:null, 
    LINK_URL:null, 
    UNDERLINE:null, 
    FONT_FAMILY:null, 
    BACKGROUND_COLOR:null
})

我试图遍历Header的Child对象并对每个孩子执行类似的setAttributes(getAttributes),但无济于事。

我还认为Header / Footer对象上的copy()函数很有希望,但是当我尝试时

newDocFooter = activeDocFooter.copy();

但是,这会生成没有文本或格式的空白页脚。

有没有一种方法可以将格式,字体和水平对齐方式从一个页眉/页脚复制到另一个页眉/页脚?

1 个答案:

答案 0 :(得分:0)

我完全不熟悉DocumentApp,但广泛对我有用:

/**
 * Copies headers from one document to another.
 * @param {string} source The source document URL.
 * @param {string} target The target document URL.
 */
function copyHeader(source, target) {      
  // Used to map from child types to required "append<X>" method
  var functionMap = {
    PARAGRAPH: 'appendParagraph',
    LIST_ITEM: 'appendListItem',
    HORIZONTAL_RULE: 'appendHorizontalRule',
    IMAGE: 'appendImage',
    TABLE: 'appendTable'
  };

  var t = DocumentApp.openByUrl(target);
  var s = DocumentApp.openByUrl(source);

  var sourceHeader = s.getHeader();
  var targetHeader = t.getHeader();

  // If there is no header in the target doc, add one
  if (!targetHeader) {
    targetHeader = t.addHeader();
  }
  targetHeader.clear();

  // Docs requires one child element, so one will remain even
  // after clearing. Get a reference to it so it can be removed
  var targetNumChild = targetHeader.getNumChildren();
  if (targetNumChild === 1) {
    var placeholderElement = targetHeader.getChild(0);
  }

  // Copy across each element to the target doc
  var c = sourceHeader.getNumChildren();
  for (var i = 0; i < c; i++) {
    var element = sourceHeader.getChild(i).copy();
    var method = functionMap[element.getType()];
    targetHeader[method](element);
  }

  // Remove the saved element if required
  if (targetHeader.getNumChildren() > 1 && placeholderElement) {
    targetHeader.removeChild(placeholderElement);
  }
}

我之所以广泛地说,只是因为大胆,横向居中,水平规则等格式都被复制在精美但奇怪的列表中,似乎从编号转变为项目符号,因此在翻译中丢失了一些内容。

可能需要稍微调整,肯定有一种更简单的方法,但在没有任何其他情况下,这可能是一个开始。

来源文件:

enter image description here

目标文件,请注意列表类型不是很正确!:

enter image description here

希望它有所帮助。