Google Apps脚本 - 复制脚注内容时保留链接



背景

我有一个Google Apps脚本,我们用来解析用双括号包裹的脚注内容,代替脚注编号Superscript。预期的结果应为:

脚本之前

这是我的足球索引。 1


1 这是我的 链接和重点

的footie内容

脚本之后

这是我的足球指数。((这是我的footie内容 链接和重点。)

问题

一切正常,除非我在双括号中解析脚注,否则它们正在失去所有链接和格式:

这是我的足球指数。((这是我的footie内容 链接和重点。)

如果有人可以帮助我修复下面的代码,我将非常感谢您的帮助:)

解决方案:

function convertFootNotes () {
  var doc = DocumentApp.getActiveDocument()
  var copy = generateCopy(doc) // make a copy to avoid damaging the original
  var openCopy = doc; //DocumentApp.openById(copy.getId()) // you have to use the App API to copy, but the Doc API to manipulate
  performConversion(openCopy); // perform formatting on the copy
}
function performConversion (docu) {
  var footnotes = docu.getFootnotes(); // get the footnotes
  footnotes.forEach(function (note) {
    // Traverse the child elements to get to the `Text` object
    // and make a deep copy
    var paragraph = note.getParent(); // get the paragraph
    var noteIndex = paragraph.getChildIndex(note); // get the footnote's "child index"
    insertFootnote(note.getFootnoteContents(),true, paragraph, noteIndex);
    note.removeFromParent();
  })
} 
function insertFootnote(note, recurse, paragraph, noteIndex){
  var numC = note.getNumChildren(); //find the # of children
  paragraph.insertText(noteIndex," ((");
  noteIndex++;
  for (var i=0; i<numC; i++){
    var C = note.getChild(i).getChild(0).copy();
    if (i==0){
      var temp = C.getText();
      var char1 = temp[0];
      var char2 = temp[1];
      if (C.getText()[0]==" "){
        C = C.deleteText(0,0);
      }
    }
    if (i>0){
      paragraph.insertText(noteIndex,"n");
      noteIndex++;
    }
    paragraph.insertText(noteIndex,C);
    noteIndex++;
  } //end of looping through children
  paragraph.insertText(noteIndex,"))");
}
function generateCopy (doc) {
  var name = doc.getName() + ' #PARSED_COPY' // rename copy for easy visibility in Drive
  var id = doc.getId()
  return DriveApp.getFileById(id).makeCopy(name)
}

除了添加的 ))以外的代码是否有任何更改以使其无法正常工作?删除((&amp;))在测试时仍未应用格式。getText()将元素内容返回为 String,而不是包含格式信息的丰富文本对象/元素。

到达Text对象:

  1. getFootnoteContents().getChild(0)返回脚注Paragraph
  2. getChild(0).getChild(0)返回该段的Text对象
  3. copy()返回文本对象的独立深层副本与
  4. 一起使用

注意:如果FootnoteSection中还有其他子元素或Paragraph子女中的其他子元素,您将需要添加某种类型/索引检查以获取正确的一个类型/索引。但是,使用基本脚注 - 如上示例 - 这是正确的路径。

function performConversion (docu) {
  var footnotes = docu.getFootnotes() // get the footnotes
  var noteText = footnotes.map(function (note) {
    // Traverse the child elements to get to the `Text` object
    // and make a deep copy
    var note_text_obj = note.getFootnoteContents().getChild(0).getChild(0).copy();
    // Add the `((` & `))` to the start and end of the text object
    note_text_obj.insertText(0, " ((");
    note_text_obj.appendText(")) ");
    return note_text_obj // reformat text with parens and save in array
  })
  ...
}

相关内容

  • 没有找到相关文章

最新更新