【问题标题】:Counting the number of lines in Google Document计算 Google 文档中的行数
【发布时间】:2018-03-21 14:49:36
【问题描述】:

问题:

我希望能够计算 Google 文档中的行数。例如,脚本必须为以下文本返回 6。

似乎没有任何可靠的方法可以从文本中提取 '\n' 或 '\r' 字符。

text.findText(/\r/g)  //OR
text.findText(/\n/g)

第二行代码无论如何都不应该工作,因为根据 GAS 文档,'换行符会自动转换为 /r'

【问题讨论】:

  • 可能类似于text.split(/\r\n|\r|\n/).length?
  • 超过一行的句子怎么办?如果你只想要一个paragraph count,那么计算\n\r 似乎是不必要的。
  • @SimeonNakov 谢谢,它可以工作,但它会返回我预期的段落数。所以似乎没有办法计算谷歌文档中的行数:(
  • @tehhowch 我的意图是按所述计算单个行(而不是段落)。您可以通过调用 body.getParagraphs().length 来简单地计算段落,但是,我对文档中的声明感到困惑,即“所有换行符都转换为 \r”,这似乎确实如此,所以这个问题没有解决。
  • 我认为这里要问什么很清楚。提问者想知道是否有一种简单的方法来获取行数。也许他们正在编写要求全部在一页上的文档,而接收他们的人更喜欢较小的类型,只是为了将文档全部放在一页上。不幸的是,我认为这个简单的答案是否定的,没有提供我所知道的行数的函数。

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


【解决方案1】:

如果您仍在寻找解决方案,那么这个答案如何?不幸的是,我找不到用于检索 Google 文档中的行数的准备方法。为了做到这一点,这个解决方法怎么样?

如果可以检测到每行的结尾,则可以检索行数。所以我尝试使用 OCR 添加每一行的结束标记。我认为可能有几种解决方法可以解决您的问题。因此,请将此视为其中之一。

在 Google 文档中,当句子超过页面宽度时,句子会自动换行。但是换行符没有\r\n\n。当用户通过回车键换行时,换行符有\r\n\n。这样,从文档中检索到的文本数据只有用户给出的换行符。在您的情况下,您的文档似乎在incididuntconsequat. 之后有换行符。所以行数不会变成6。

我认为 OCR 可能可以用于这种情况。流程如下。

  1. 将 Google 文档转换为 PDF。
  2. 使用 OCR 将 PDF 转换为文本数据。
    • 我为 OCR 选择了 "ocr.space"
      • 如果您已经知道 OCR 的 API,可以尝试这样做。
    • 当我使用 Drive API 的 OCR 时,\r\n\n 的换行符没有添加到转换后的文本数据中。所以我使用了ocr.space。 ocr.space 可以添加换行符。
  3. 在转换后的文本数据中计数\n
    • 此数字表示行数。

上述流程的示例脚本如下。当您使用它时,请在"ocr.space" 检索您的apikey。当您在表单中输入您的信息和电子邮件时,您将收到一封包含 API 密钥的电子邮件。请将其用于此示例脚本。请阅读 API 的配额。我使用免费计划对此进行了测试。

示例脚本:

var apikey = "### Your API key for using ocr.space ###";

var id = DocumentApp.getActiveDocument().getId();
var url = "https://docs.google.com/feeds/download/documents/export/Export?id=" + id + "&format=pdf&access_token=" + ScriptApp.getOAuthToken();
var blob = UrlFetchApp.fetch(url).getBlob();
var payload = {method: "POST", headers: {apikey: apikey}, payload: {file: blob}};
var ocrRes = JSON.parse(UrlFetchApp.fetch("https://api.ocr.space/Parse/Image", payload));
var result = ocrRes.ParsedResults.map(function(e){return e.ParsedText.match(/\n/g).length})[0];
Logger.log(result)

结果:

使用你的句子时,脚本的结果是6。

注意:

  • 即使文档的最后一行没有\r\n\n,转换后的文本数据在所有行的末尾都有\r\n
  • 在这种情况下,OCR 的精度并不重要。重要的一点是检索换行符。

我为几个文档测试了这个脚本。在我的环境中,可以检索到正确的行数。但我不确定这个脚本是否适用于您的环境。如果此脚本不能用于您的环境,很抱歉。

【讨论】:

  • 现代 IT 太疯狂了。
【解决方案2】:

正如您在 cmets 中所指出的,没有 API 可以检索 Google Docs 中的行数。这是因为文档是在客户端动态呈现的,所以服务器不知道这个数字。

一种可能的解决方案是抓取 Google Doc 的 HTML,因为每一行都用它自己的 div 和“kix-lineview”类重新渲染,但是您需要在 iframe 或无头浏览器中实际打开页面然后逐页滚动以使它们呈现,然后能够计算 div

【讨论】:

    【解决方案3】:

    在«文件»菜单中使用«发布到网络»发布您的 Google 文档后,使用以下脚本中的 URL:

    var url = "https://docs.google.com/document/d/e/2PACX-1vSElK...iwUhaFo/pub";
    var text = UrlFetchApp.fetch(url).getContentText();
    var count = (text.match(/<\/br>/g) || []).length;
    Logger.log(count.toString());
    

    这仅在您的所有文档行都以 &lt;/br&gt; 结尾时才方便,尽管可以添加任何其他变体:

    var url = "https://docs.google.com/document/d/e/2PACX-1vSElK...iwUhaFo/pub";
    var text = UrlFetchApp.fetch(url).getContentText();
    var count1 = (text.match(/<\/br>/g) || []).length;
    var count2 = (text.match(/<\/p>/g) || []).length;
    var count3 = (text.match(/<hr>/g) || []).length;
    var count = coun1 + coung2 + count3;
    Logger.log(count);
    

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2011-03-09
      • 1970-01-01
      • 2013-08-30
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多