使用Google Apps Script从Google文档中提取文本中的链接URL

6

我正在使用Google Apps Script,尝试检索由GAS函数返回的文本字符串中一个单词所超链接的URL,但是我得到了下面列出的错误。

如您所见,从我的代码中可以看出,我是初学者,因此非常感谢任何帮助和“最佳实践”。

GAS IDE返回的错误消息

TypeError:在HYPERLINK对象中找不到getLinkUrl函数,无法打开“Intro To Google Documents”文档。打开您的MrBenrudShared文件夹并创建一个新的空白Google文档。将其命名为“Your Name: Intro To Google Documents”..(第19行,“Code”文件)

GAS函数

function getURLfromHyprlink() {
  var body = DocumentApp.getActiveDocument().getBody();
  Logger.log(body.getNumChildren());

  // table is bode child element #1 of 3.
  var rubricTable = body.getChild(1);
  Logger.log(rubricTable);

  // Find out about row 3 in table
  var studentWorkRow = rubricTable.getChild(2);
  Logger.log(studentWorkRow);

  // Find what is in column2 of hyperlink row
  var studentHyperlinkCell = studentWorkRow.getChild(1);
  Logger.log(studentHyperlinkCell); //tells me it is a table cell

  // Returns text from studentHyperlinkCell
  var hyperlinkText = studentHyperlinkCell.asText().getText();
  var hyperlinkURL = hyperlinkText.getLinkUrl();
  Logger.log(hyperlinkURL); 

  }

以上函数返回的字符串

超链接到你的“介绍Google文档”文件。

打开你的MrBenrudShared文件夹并创建一个新的空白Google文档。将其命名为“你的名字:介绍Google文档”。

URL仅在单词超链接上,并不在其余的字符串上。

该文档位于https://docs.google.com/document/d/18zJMjXWoBNpNzrNuPT-nQ_6Us1IbACfDNXQZJqnj1P4/edit#,你可以在表格的第三行看到单词“超链接”和超链接。

感谢您的帮助!


1
刚才我请求你在谷歌上与我分享权限。 - JSmith
刚刚尝试了getLinkUrl(0),但是没有起作用。 - Mr. B
2个回答

5
您想要检索Google文档中文本超链接的URL。
在您的情况下,您要检索的文本位于一个表格中,该表格可以在您共享的示例文档中看到。
如果我对您的问题的理解是正确的,那么如何进行修改呢?
修改要点:
- 检索每个单元格。 - 从每个单元格检索子项并从子项检索文本。 - 在您的情况下,它将每个单词拆分成一组文本。 - 检查每个单词的超链接,并在单词具有链接时检索链接。
- 对此使用getLinkUrl(offset)
反映上述要点的脚本如下。当您使用此修改后的脚本时,请将此脚本复制并粘贴到您共享的Google文档的脚本编辑器中,并运行sample()
修改后的脚本:
function sample() {
  var body = DocumentApp.getActiveDocument().getBody();
  var table = body.getTables()[0];
  var rows = table.getNumRows();
  var result = [];
  for (var i = 0; i < rows; i++) {
    var cols = table.getRow(i).getNumCells();
    for (var j = 0; j < cols; j++) {
      var cell = table.getCell(i, j);
      for (var k = 0; k < cell.getNumChildren(); k++) {
        var child = cell.getChild(k).asText();
        var text = child.getText(); // Retrieve text of a child in a cell.
        var words = text.match(/\S+/g); // Split text every word.
        if (words) {
          var links = words.map(function(e) {return {
            text: text,
            linkedWord: e,
            url: child.getLinkUrl(child.findText(e).getStartOffset()), // Check the link every word.
          }}).filter(function(e) {return e.url != null}); // Retrieve the link when the word has the link.
          if (links.length > 0) result.push(links);
        }       
      }
    }
  }
  result = Array.prototype.concat.apply([], result);
  Logger.log(result)
}

结果:

当此脚本用于您的共享样例文档时,将检索到以下结果。

[
  {
    "text": "HYPERLINK  to your “Intro To Google Documents” document. ",
    "linkedWord": "HYPERLINK",
    "url": "https://docs.google.com/document/d/1HDGUxgqZYVQS5b8gLtiQTNumaXRjP2Ao1fHu2EFqn_U/edit"
  },
  {
    "text": "Video",
    "linkedWord": "Video",
    "url": "http://mrbenrud.net/videos/video.php?id=&v=EhnT8urxs_E&title=How to Create a Folder in Google Drive&description="
  },
  {
    "text": "Some instructions will have hyperlinks and other will use different types for formating. ",
    "linkedWord": "hyperlinks",
    "url": "https://docs.google.com/document/d/1tS-Pq2aqG7HpsMA5br2NzrjH9DFdiz9oA0S70vejg4c/edit"
  },
  {
    "text": "Video",
    "linkedWord": "Video",
    "url": "http://mrbenrud.com/index.php/tutorials/project-tutorials/94-how-to-share-a-folder-in-google-drive-with-someone-else-so-they-can-edit-it"
  },
  {
    "text": "Video",
    "linkedWord": "Video",
    "url": "http://mrbenrud.com/index.php/tutorials/project-tutorials/98-how-to-move-a-document-in-google-drive-into-another-folder"
  },
  {
    "text": "Video",
    "linkedWord": "Video",
    "url": "http://mrbenrud.com/index.php/tutorials/project-tutorials/96-how-to-search-for-and-filter-through-images-using-google"
  },
  {
    "text": "Video",
    "linkedWord": "Video",
    "url": "http://mrbenrud.com/index.php/tutorials/project-tutorials/99-how-to-rename-file-on-a-mac-in-osx"
  }
]

注意:

  • 在此脚本中,将检索表格中的所有链接。因此,如果您想检索特定单元格,请修改该脚本。

参考文献:

如果我误解了您的问题,我很抱歉。


1
谭艾克,感谢您对此的工作!有两个问题:第一,我是否需要将段落分解为单个单词才能使getLinkUrl()函数正常工作?第二,如果我只想从段落字符串的第一个字母获取链接的URL,我应该使用getLinkUrl([0])吗? - Mr. B
1
@Mr. B 谢谢您的回复。A1:您也可以搜索每个字符。在您的情况下,我发现超链接包含在文本中的每个单词中。因此,我认为拆分每个单词可能是合适的。A2:在这种情况下,例如,您可以使用“cell.getChild(k).asText().getLinkUrl(n)”检索它。在您的另一个问题的情况下,您可以使用“var paragraphText = paragraph.asText().getLinkUrl(2)”。 - Tanaike
1
A2成功了!非常感谢!不开玩笑,我已经在这上面工作了四个多小时,唯一缺少的就是.asText()...再次感谢! - Mr. B
1
@Mr. B 欢迎。我很高兴您的问题得到了解决。同时,我也从您的问题中学到了东西。谢谢你。 - Tanaike
1
是的。我实际上正在更新有关该问题的GAS。我该如何在那里给你答案的功劳?如果不是你在这里的帮助,我就没有这个答案了。 - Mr. B
显示剩余2条评论

1
这篇文章帮助我更好地理解Google Docs处理超链接的机制。
以下是我提供的文档全局搜索和替换方案: https://gist.github.com/vladox/f8cd873571ffa8038fb15175a476f20b
var oldLink = "https://your-old-link-here";
var newLink = "https://your-new-link-here";
var documentId = 'YOUR-GOOGLE-DOCUMENT-ID-HERE';
var doc = DocumentApp.openById(documentId);
var searchType = DocumentApp.ElementType.TEXT;

function findAndReplaceLinks() {
  var body = doc.getBody();
  var text = body.getText();

  var searchResult = null;
  var searchResultTextElement = null;
  var searchResultText = "";
  while (searchResult = body.findElement(searchType, searchResult)) {
    searchResultTextElement = searchResult.getElement().asText();
    searchResultText = searchResultTextElement.getText();
    // Logger.log("TEXT: %s", searchResultText);

    var words = searchResultText.match(/\S+/g);
    if (words) {
      words.map(function (e) {
        // sanitize search terms for regex relevent symbols
        e = e.replaceAll("(", "\\(").replaceAll(")", "\\)").replaceAll("+", "\\+").replaceAll("*", "\\*");
        e = e.replaceAll("[", "\\[").replaceAll("]", "\\]").replaceAll("{", "\\{").replaceAll("}", "\\}");
        // Logger.log("WORD: %s", e);

        var partialElementUrl = null;
        if (e.trim() != "") {
          var partialElement = searchResultTextElement.findText(e);
          var partialElementText = partialElement.getElement().asText();
          var startOffset = partialElement.getStartOffset();
          var endOffsetInclusive = partialElement.getEndOffsetInclusive();
          partialElementUrl = searchResultTextElement.getLinkUrl(partialElement.getStartOffset());
          if (partialElementUrl != null) {
            var updatedUrl = partialElementUrl.replace(oldLink, newLink);
            if (partialElementUrl.includes(oldLink)) {
              Logger.log("REPLACING WORD: %s AT OFFSET: %s", partialElementText.getText().substring(startOffset, endOffsetInclusive + 1), startOffset);
              partialElementText.setLinkUrl(startOffset, endOffsetInclusive, updatedUrl);
            } else if (partialElementUrl.includes(newLink)) {
              Logger.log("ALREADY REPLACED WORD: %s", partialElementUrl);
            }
          }
        }
      });
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接