获取文档中的所有链接 [英] Get All Links in a Document
问题描述
在Google文档/云端硬盘(例如段落,列表,表格)中包含分散在整个内容中的外部链接的正常文档时,如何编译使用Google Apps脚本的链接列表?
b$ b
具体而言,我想通过在每个网址中搜索 oldText 来更新文档中的所有损坏的链接,并用 newText替换它在每个网址中,但不是文字。
我不认为替换文本部分的开发文档是我需要的 - 是否需要扫描文档的每个元素?我可以只 editAsText 并使用html正则表达式?例子将不胜感激。
这只是最痛苦的! 代码可以作为要点的一部分。
是的,我无法拼写。 下面是一个实用程序函数,用于扫描所有文档LinkUrls,将它们返回到数组中。 此实用程序建立在 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
/ **
*获取文档中所有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
。
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);
}
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屋!