【问题标题】:How do I Iterate over all elements in a google document?如何迭代谷歌文档中的所有元素?
【发布时间】:2018-08-29 13:32:16
【问题描述】:

我正在尝试遍历文档中的每个元素,获取每个段落的开始/结束位置。但它保持返回-1。任何想法我做错了什么?

  var body = doc.getBody(); 

  var elements = body.getNumChildren();
  for( var i=0;i<elements;i++) {

   var element = body.getChild(i).copy();            
   var type = element.getType();
   if( type == DocumentApp.ElementType.PARAGRAPH ){
     var text = element.asParagraph().getText();

     var range = element.asParagraph().findElement(DocumentApp.ElementType.PARAGRAPH);
     var start = range.getStartOffset();
     var finish = range.getEndOffsetInclusive();

【问题讨论】:

  • 你在记录什么?你在哪里定义变量doc
  • 在开发这个单一方法时,我正在使用这个: var doc = DocumentApp.openById('1Q6v8ipqA81LoPtpk71NdqTaIEqMjki1KIJbrm0bILBg'); var body = doc.getBody();一旦我让它工作,我会像这样将该方法集成到我的应用程序中: var body = DocumentApp.getActiveDocument().getBody();
  • Google 文档中没有“每个段落的开始/结束位置”之类的东西,因此无法找到它们。 getStartOffset 等指的是别的东西。 Google 文档结构类似于 HTML。 div 元素在网页上的起始位置是什么?

标签: javascript loops google-apps-script google-docs paragraphs


【解决方案1】:

根据official docs,只有当当前用户在页面上有选择时,Range 类才可访问。因此,您可以让脚本工作,但它需要一些用户输入,而不是在空白文档上运行。

function getRange() {
  var ui = DocumentApp.getUi();

  // Get the user selection. Display an alert if there is none.
  var selection = DocumentApp.getActiveDocument().getSelection();

  if(selection) {

  // Get all the elements in the current selection
  var elements = selection.getRangeElements();

  for( var i=0;i<elements.length;i++) {

   var el = elements[i]

   // Can it be edited as text? If not, skip it
   if(el.getElement().editAsText) {
     var start = el.getStartOffset()
     var finish = el.getEndOffsetInclusive();
     ui.alert("start: " + start + ", finish: " + finish)
   } else {
      ui.alert("Text not selected!");
    }
  }
  } else {
    ui.alert("Nothing is selected!");
  }
}

偏移量根据最后一个元素检查选择的位置。如果是文本,则返回索引。如果不是(例如分页符或图像),它将返回 -1。

添加一个简单的onOpen 事件将允许您从自定义菜单运行脚本以进行测试:

function onOpen() {
  var ui = DocumentApp.getUi();

  ui.createMenu("Offsets").addItem("Run", "getRange").addToUi()
}

【讨论】:

  • 这是一个奇怪的限制。强制最终用户在单击按钮之前选择整个文档不适合我的用例。有没有办法获取文档中的所有范围?我正在尝试实现另一个问题的答案,但我需要实现在整个文档上工作,而不仅仅是选定区域:stackoverflow.com/questions/37771381/…
  • 不,因为范围的选择。最终目的是什么?为什么不能把文档中的所有段落放在一个数组中然后循环呢?
  • 我正在尝试将所有 \n 字符替换为 \v 字符,因为正则表达式识别 \n... 存在问题,如我之前评论中引用的文章中所述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2023-04-03
  • 2014-10-17
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多