获取文档中的所有链接 [英] Get All Links in a Document

查看:146
本文介绍了获取文档中的所有链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Google文档/云端硬盘(例如段落,列表,表格)中包含分散在整个内容中的外部链接的正常文档时,如何编译使用Google Apps脚本的链接列表?

b
$ b

具体而言,我想通过在每个网址中搜索 oldText 来更新文档中的所有损坏的链接,并用 newText替换它在每个网址中,但不是文字。



我不认为替换文本部分的开发文档是我需要的 - 是否需要扫描文档的每个元素?我可以只 editAsText 并使用html正则表达式?例子将不胜感激。

解决方案

这只是最痛苦的! 代码可以作为要点的一部分



是的,我无法拼写。

getAllLinks



下面是一个实用程序函数,用于扫描所有文档LinkUrls,将它们返回到数组中。

  / ** 
*获取文档中所有LinkUrls的数组。该函数是
*递归,如果没有提供元素,它将默认为
*活动文档的Body元素。
*
* @param {Element}元素要操作的文档元素。
*。
* @returns {Array}对象数组,
* {元素,
* startOffset,
* endOffsetInclusive,
* url}
* /
函数getAllLinks(element){
var links = [];
element = element || 。DocumentApp.getActiveDocument()getBody();

if(element.getType()=== DocumentApp.ElementType.TEXT){
var textObj = element.editAsText();
var text = element.getText();
var inUrl = false; (var ch = 0; ch var url = textObj.getLinkUrl(ch);

if(url!= null){
if(!inUrl){
//我们现在是!
inUrl = true;
var curUrl = {};
curUrl.element = element;
curUrl.url = String(url); //获取副本
curUrl.startOffset = ch;
}
else {
curUrl.endOffsetInclusive = ch;
}
}
else {
if(inUrl){
//不再,我们不是。
inUrl = false;
links.push(curUrl); //添加到链接
curUrl = {};
}
}
}
}
else {
var numChildren = element.getNumChildren();
for(var i = 0; i< numChildren; i ++){
links = links.concat(getAllLinks(element.getChild(i)));
}
}

返回链接;
}



findAndReplaceLinks



此实用程序建立在 getAllLinks 上以执行find&替换功能。

  / ** 
*替换文档中的全部或部分UrlLinks。
*
* @param {String} searchPattern正则表达式模式以搜索
* @param {String}替换文本以用作替换
*
* @返回{Number}网址数量已更改
* /
函数findAndReplaceLinks(searchPattern,replacement){
var links = getAllLinks();
var numChanged = 0;

for(var l = 0; l< links.length; l ++){
var link = links [l];
if(link.url.match(searchPattern)){
//此链接需要更改
var newUrl = link.url.replace(searchPattern,replacement);
link.element.setLinkUrl(link.startOffset,link.endOffsetInclusive,newUrl);
numChanged ++
}
}
return numChanged;



$ h $ Demo b



  function onOpen(){
//添加一些包含项目,分隔符和子菜单的菜单。
DocumentApp.getUi()。createMenu('Utils')
.addItem('List Links','sidebarLinks')
.addItem('Replace Link Text','searchReplaceLinks')
.addToUi();
}

函数searchReplaceLinks(){
var ui = DocumentApp.getUi();
var app = UiApp.createApplication()
.setWidth(250)
.setHeight(100)
.setTitle('Change Url text');
var form = app.createFormPanel();
var flow = app.createFlowPanel();
flow.add(app.createLabel(Find:));
flow.add(app.createTextBox()。setName(searchPattern));
flow.add(app.createLabel(Replace:));
flow.add(app.createTextBox()。setName(replacement));
var handler = app.createServerHandler('myClickHandler');
flow.add(app.createSubmitButton(Submit).addClickHandler(handler));
form.add(flow);
app.add(form);
ui.showDialog(app);
}

// ClickHandler关闭对话框
function myClickHandler(e){
var app = UiApp.getActiveApplication();

app.close();
返回应用程序;
}

函数doPost(e){
var numChanged = findAndReplaceLinks(e.parameter.searchPattern,e.parameter.replacement);
var ui = DocumentApp.getUi();
var app = UiApp.createApplication();

sidebarLinks(); //更新列表

var result = DocumentApp.getUi()。alert(
'Results',
已更改+ numChanged +urls。,
DocumentApp .getUi()ButtonSet.OK)。
}


/ **
*在Google文档编辑器的边栏中显示自定义HTML用户界面。
* /
函数sidebarLinks(){
var links = getAllLinks();
var sidebar = HtmlService
.createHtmlOutput()
.setTitle('URL Links')
.setWidth(350 / * pixels * /);

//显示链接列表,仅限url。
for(var l = 0; l< links.length; l ++){
var link = links [l];
sidebar.append('< p> + link.url);
}

DocumentApp.getUi()。showSidebar(sidebar);
}


Given a "normal document" in Google Docs/Drive (e.g. paragraphs, lists, tables) which contains external links scattered throughout the content, how do you compile a list of links present using Google Apps Script?

Specifically, I want to update all broken links in the document by searching for oldText in each url and replace it with newText in each url, but not the text.

I don't think the replacing text section of the Dev Documentation is what I need -- do I need to scan every element of the doc? Can I just editAsText and use an html regex? Examples would be appreciated.

解决方案

This is only mostly painful! Code is available as part of a gist.

Yeah, I can't spell.

getAllLinks

Here's a utility function that scans the document for all LinkUrls, returning them in an array.

/**
 * Get an array of all LinkUrls in the document. The function is
 * recursive, and if no element is provided, it will default to
 * the active document's Body element.
 *
 * @param {Element} element The document element to operate on. 
 * .
 * @returns {Array}         Array of objects, vis
 *                              {element,
 *                               startOffset,
 *                               endOffsetInclusive, 
 *                               url}
 */
function getAllLinks(element) {
  var links = [];
  element = element || DocumentApp.getActiveDocument().getBody();

  if (element.getType() === DocumentApp.ElementType.TEXT) {
    var textObj = element.editAsText();
    var text = element.getText();
    var inUrl = false;
    for (var ch=0; ch < text.length; ch++) {
      var url = textObj.getLinkUrl(ch);
      if (url != null) {
        if (!inUrl) {
          // We are now!
          inUrl = true;
          var curUrl = {};
          curUrl.element = element;
          curUrl.url = String( url ); // grab a copy
          curUrl.startOffset = ch;
        }
        else {
          curUrl.endOffsetInclusive = ch;
        }          
      }
      else {
        if (inUrl) {
          // Not any more, we're not.
          inUrl = false;
          links.push(curUrl);  // add to links
          curUrl = {};
        }
      }
    }
  }
  else {
    var numChildren = element.getNumChildren();
    for (var i=0; i<numChildren; i++) {
      links = links.concat(getAllLinks(element.getChild(i)));
    }
  }

  return links;
}

findAndReplaceLinks

This utility builds on getAllLinks to do a find & replace function.

/**
 * Replace all or part of UrlLinks in the document.
 *
 * @param {String} searchPattern    the regex pattern to search for 
 * @param {String} replacement      the text to use as replacement
 *
 * @returns {Number}                number of Urls changed 
 */
function findAndReplaceLinks(searchPattern,replacement) {
  var links = getAllLinks();
  var numChanged = 0;

  for (var l=0; l<links.length; l++) {
    var link = links[l];
    if (link.url.match(searchPattern)) {
      // This link needs to be changed
      var newUrl = link.url.replace(searchPattern,replacement);
      link.element.setLinkUrl(link.startOffset, link.endOffsetInclusive, newUrl);
      numChanged++
    }
  }
  return numChanged;
}

Demo UI

To demonstrate the use of these utilities, here are a couple of UI extensions:

function onOpen() {
  // Add a menu with some items, some separators, and a sub-menu.
  DocumentApp.getUi().createMenu('Utils')
      .addItem('List Links', 'sidebarLinks')
      .addItem('Replace Link Text', 'searchReplaceLinks')
      .addToUi();
}

function searchReplaceLinks() {
  var ui = DocumentApp.getUi();
  var app = UiApp.createApplication()
                 .setWidth(250)
                 .setHeight(100)
                 .setTitle('Change Url text');
  var form = app.createFormPanel();
  var flow = app.createFlowPanel();
  flow.add(app.createLabel("Find: "));
  flow.add(app.createTextBox().setName("searchPattern"));
  flow.add(app.createLabel("Replace: "));
  flow.add(app.createTextBox().setName("replacement"));
  var handler = app.createServerHandler('myClickHandler');
  flow.add(app.createSubmitButton("Submit").addClickHandler(handler));
  form.add(flow);
  app.add(form);
  ui.showDialog(app);
}

// ClickHandler to close dialog
function myClickHandler(e) {
  var app = UiApp.getActiveApplication();

  app.close();
  return app;
}

function doPost(e) {
  var numChanged = findAndReplaceLinks(e.parameter.searchPattern,e.parameter.replacement);
  var ui = DocumentApp.getUi();
  var app = UiApp.createApplication();

  sidebarLinks(); // Update list

  var result = DocumentApp.getUi().alert(
      'Results',
      "Changed "+numChanged+" urls.",
      DocumentApp.getUi().ButtonSet.OK);
}


/**
 * Shows a custom HTML user interface in a sidebar in the Google Docs editor.
 */
function sidebarLinks() {
  var links = getAllLinks();
  var sidebar = HtmlService
          .createHtmlOutput()
          .setTitle('URL Links')
          .setWidth(350 /* pixels */);

  // Display list of links, url only.
  for (var l=0; l<links.length; l++) {
    var link = links[l];
    sidebar.append('<p>'+link.url);
  }

  DocumentApp.getUi().showSidebar(sidebar);
}

这篇关于获取文档中的所有链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆